پچھلے مضمون میں ، ہم نے سی ++ زبان ، بنیادی گرائمر ، اور حکمت عملی کی ساخت کے تعارف سے ہی تجارتی حکمت عملی کو نافذ کرنے کا فرض بیان کیا تھا۔ اس مضمون میں ، ہم پچھلے حصے کو جاری رکھیں گے اور ایک قابل عمل مقداری تجارتی حکمت عملی کو قدم بہ قدم نافذ کریں گے۔
تکنیکی تجزیہ میں سب سے زیادہ استعمال ہونے والے اشارے میں سے ایک ، کے ڈی جے ، کو دنیا بھر کے بیشتر تاجروں نے تسلیم کیا تھا۔ کے ڈی جے
KDJ شماریاتی نظریہ پر مبنی تھا ، ایک بے ترتیب قدر (RSV) کا حساب تازہ ترین 9 K لائن
رفتار کے تصور ، طاقت کے اشارے اور چلتی اوسط کے فوائد کو جوڑ کر ، ہم اسٹاک کی قیمت کی معمول کی حد کی نقل و حرکت سے تغیر کی ڈگری کی پیمائش کرتے ہیں۔ جب K کی قیمت D کی قیمت سے زیادہ ہے تو ، اس سے یہ ظاہر ہوتا ہے کہ اسٹاک کی قیمت فی الحال اوپر کے رجحان میں ہے۔ لہذا ، جب K لائن نیچے سے اوپر کی طرف D لائن کو عبور کرتی ہے ، تو اسٹاک خریدنے کا وقت آگیا ہے۔ اس کے برعکس ، جب K کی قیمت D کی قیمت سے کم ہے ، تو اس سے یہ ظاہر ہوتا ہے کہ اسٹاک مارکیٹ فی الحال نیچے کے رجحان میں ہے۔ لہذا ، جب K لائن اوپر سے نیچے کی طرف D لائن کو عبور کرتی ہے ، تو اسٹاک فروخت کرنے کا وقت آگیا ہے۔
KDJ اشارے کا حساب لگانا پیچیدہ ہے۔ پہلے ، بے ترتیب قدر (RSV) کا حساب لگایا جاتا ہے ، اور پھر K قدر ، D قدر ، اور J قدر کا حساب لگایا جاتا ہے۔ اس کے حساب کتاب کا طریقہ مندرجہ ذیل ہے:
RSV = (ختم قیمت - N مدت کی کم قیمت) / (N سائیکلوں کی اعلی ترین قیمت - N سائیکلوں کی کم ترین قیمت) * 100
K قدر = N سائیکل RSV کا اوسط
D ویلیو = N سائیکل K کا اوسط
J قدر = 3 * K قدر -2 * D قدر
void main(){ // the program starts from this main function
while (true){ // enter the loop
auto ct = exchange.SetContractType(symblo); //set the contract type
auto r = exchange.GetRecords(); // get the K line array
auto arr = TA.KDJ(r, 9, 3, 3); // calculate the KDJ indicator
auto k = arr[0]arr[0].size() - 2]; // get the previous k line KDJ indicator K value
auto d = arr[1]arr[1].size() - 2]; // get the previous k line KDJ indicator D value
auto j = arr[2]arr[2].size() - 2]; // get the previous k line KDJ indicator J value
}
}
KDJ کو استعمال کرنے کے بہت سے طریقے ہیں ، جو اکیلے یا دوسرے اشارے کے ساتھ مل کر استعمال کیے جاسکتے ہیں۔ اس مضمون میں ہم اسے آسان ترین طریقے سے استعمال کریں گے ، جو یہ ہیں: اگر K کی قیمت D کی قیمت سے زیادہ ہے تو ، ہم سمجھتے ہیں کہ خریداری کی طاقت مضبوط ہورہی ہے ، بڑھتی ہوئی مارکیٹ کی لہر تشکیل دی گئی ہے ، اور افتتاحی طویل پوزیشن کا اشارہ پیدا ہوتا ہے۔ اگر K کی قیمت D کی قیمت سے کم ہے تو ، ہم سمجھتے ہیں کہ فروخت کی طاقت مضبوط ہورہی ہے ، اور نیچے کی رجحان کی لہر تشکیل دی گئی ہے ، مختصر پوزیشن کھولنے کا اشارہ پیدا ہوتا ہے۔
اگر پوزیشن کھولنے کے بعد ڈی ویلیو اوپر سے نیچے کی طرف بدل جاتا ہے تو ہم سمجھتے ہیں کہ خریدار کی طاقت کمزور ہو رہی ہے، یا فروخت کرنے والی طاقت مضبوط ہو رہی ہے، اور بند ہونے والی طویل پوزیشن کا سگنل پیدا ہوتا ہے۔ اگر مختصر پوزیشن کھول دی جاتی ہے تو ڈی ویلیو نیچے سے اوپر کی طرف بدل جاتا ہے، ہم سمجھتے ہیں کہ فروخت کرنے والی طاقت کمزور ہو رہی ہے، یا خریدار کی طاقت مضبوط ہو رہی ہے، اور مختصر پوزیشن بند کرنے کے سگنل پیدا ہوتے ہیں۔
کھلی طویل پوزیشن: اگر کوئی پوزیشن نہیں ہے، اور K قدر D قدر سے زیادہ ہے
مختصر پوزیشن: اگر کوئی پوزیشن نہیں ہے اور K کی قدر D کی قدر سے کم ہے
طویل پوزیشن بند کرنا: اگر طویل پوزیشن ہولڈنگ ہے اور D کی قیمت گزرنے والی K لائن کی قیمت D سے کم ہے
بندش مختصر پوزیشن: اگر مختصر پوزیشن ہولڈنگ ہے اور D کی قدر گزرنے والی K لائن کی قدر D سے زیادہ ہے
کوڈ کے ساتھ ایک حکمت عملی کو لاگو کرنے میں پہلا قدم سب سے پہلے ہم کیا ڈیٹا کی ضرورت ہے پر غور کرنا ہے؟ جس API کے ذریعے حاصل کرنے کے لئے؟ ہم اعداد و شمار حاصل کرنے کے بعد، کس طرح ٹریڈنگ منطق کا حساب کرنے کے لئے؟ اگلا، کس طرح کے احکامات رکھنے کے لئے؟ آخر میں، چلو قدم بہ قدم لاگو:
نام نہاد حکمت عملی کا فن تعمیر پوری حکمت عملی کو ڈیزائن کرنے کا طریقہ ہے۔ جیسا کہ ذیل میں دکھایا گیا ہے ، فن تعمیر میں دو افعال شامل ہیں: ایک اہم فنکشن ہے ، پروگرام بنیادی فنکشن سے شروع ہوتا ہے ، اور اس کا کام حکمت عملی کی منطق کے بنیادی حصے سے نمٹنا ہے۔ جیسے: تبادلہ کے ساتھ کنکشن ٹھیک ہے یا نہیں کا فیصلہ کرنا ، غیر ضروری لاگ انفارمیشن کو فلٹر کرنا ، حکمت عملی کے منطقی کوروں کے عملدرآمد کے وقت کے وقفے کو کنٹرول کرنا۔ اور دوسرا فنکشن آن ٹِک ہے ، اس فنکشن میں ، بنیادی طور پر حکمت عملی کی منطق ہے ، جس میں شامل ہیں: خام ڈیٹا حاصل کریں ، اعداد و شمار کا حساب لگائیں ، آرڈر دیں ، اور بہت کچھ۔
bool onTick(){ // onTick function
// strategy logic
}
void main(){ // program starts from here
while (true){ // enter the loop
if (exchange.IO("status") == 0) // if the connection with the exchange if not stable.
sleep(1000); // pause for 1 second
continue; // skip this loop, enter the next loop
}
if(!onTick()){ // if the connection with the exchange is stable, enter this if loop, start executing the onTick function
sleep(1000); // pause for 1 second
}
}
}
مندرجہ بالا کوڈ C ++ حکمت عملی کا فریم ورک ہے جو ایف ایم زیڈ کوانٹ پلیٹ فارم ٹولز کے ذریعہ تیار کیا گیا ہے۔ یہ ایک فکسڈ کوڈنگ فارمیٹ ہے ، تمام تجارتی منطق لائن 2 سے شروع ہوتی ہے ، اور کہیں اور کوئی تبدیلی نہیں کی جاتی ہے۔ اس کے علاوہ ، اگر آپ تجربہ کار ہیں تو ، آپ اپنی ضرورت کے مطابق خصوصیات کو شامل یا تبدیل کرسکتے ہیں۔
آپ ٹریڈنگ کلاس لائبریری کو ایک فنکشنل ماڈیول کے طور پر سوچ سکتے ہیں۔ ٹریڈنگ کلاس لائبریری کا استعمال کرنے کا فائدہ یہ ہے کہ یہ آپ کو حکمت عملی کی منطق لکھنے پر توجہ مرکوز کرنے کی اجازت دیتا ہے۔ مثال کے طور پر ، جب ہم ٹریڈنگ کلاس لائبریری کا استعمال کرتے ہیں ، تو کسی پوزیشن کو کھولنے یا بند کرنے کے ل we ، ہم براہ راست ٹریڈنگ کلاس لائبریری میں API انٹرفیس کا استعمال کرسکتے ہیں۔ لیکن اگر ہم ٹریڈنگ کلاس لائبریری کا استعمال نہیں کرتے ہیں تو ، ہمیں پوزیشن کھولنے پر مارکیٹ کی قیمت حاصل کرنے کی ضرورت ہے۔ غیر انجام شدہ آرڈرز کے مسئلے اور انخلا کے احکامات کے مسئلے پر غور کرنے کی ضرورت ہے ، اور اسی طرح۔
مختلف خام اعداد و شمار ٹریڈنگ منطق کا ایک اہم حصہ ہیں۔ ہمیں کس قسم کے اعداد و شمار کی ضرورت ہے؟ ہماری حکمت عملی ٹریڈنگ منطق سے ، ہمیں پہلے K- لائن کے اعداد و شمار حاصل کرنے کی ضرورت ہے۔ اصل K- لائن کے اعداد و شمار کے ساتھ ، ہم KDJ اشارے کا حساب لگاسکتے ہیں ، اور آخر میں آرڈر دینے یا نہ دینے کا تعین کرنے کے لئے K- قدر اور D- قدر کے مابین تعلقات کا موازنہ کرسکتے ہیں۔ تو آئیے یہ اعداد و شمار حاصل کریں۔
سب سے پہلے، ہم K لائن صف حاصل کرنے کی ضرورت ہے، کیونکہ K لائن صف KDJ اشارے کا حساب کرنے کے لئے استعمال کیا جائے گا. مندرجہ ذیل کے طور پر:
double position = 0; // position status parameter, the default is 0
bool onTick(string symbol){ // onTick function, all strategy logic are in this function
auto ct = exchange.SetContractType(symbol); // set the contract type and trading variety
if(ct == false){ // if the setting contract type and trading variety is not successful
return false; // return false
}
auto r = exchange.GetRecords(); // get the k-line array
if(!r.Valid || r.size() < 10){ // if getting the k-line array or the number of k-line is less than 10
return false; // return false
}
}
void main(){ // program starts from here
while (true){ // enter the loop
if (exchange.IO("status") == 0) // if the connection with the exchange if not stable.
sleep(1000); // pause for 1 second
continue; // skip this loop, enter the next loop
}
if(!onTick("this_week")){ // if the connection with the exchange is stable, enter this if loop, start executing the onTick function
sleep(1000); // pause for 1 second
}
}
}
جیسا کہ اوپر دکھایا گیا ہے:
لائن 1: ایک متغیر کی وضاحت کرتا ہے جو پوزیشن کی حیثیت حاصل کرنے کے لئے استعمال کیا جاتا ہے.
لائنوں 3 سے 12 تک: ایک آن ٹِک فنکشن کی وضاحت کی گئی ہے ، اور یہ فنکشن ایک پیرامیٹر کے ساتھ لے جاتا ہے۔ اس پیرامیٹر کو تجارتی قسم میں منتقل کرنا ہے ، اس معاملے میں ، ہفتہ وار کے لائن کا استعمال کرتے ہوئے۔
لائن 14 سے 24 تک: ایک اہم فنکشن کی وضاحت کریں جو غیر حکمت عملی منطق کو سنبھالتا ہے۔ صرف ایک ہی چیز جو تبدیل کی جاسکتی ہے وہ لائن 20 پر معاہدہ کا کوڈ
چلو onTick تقریب پر توجہ مرکوز اور یہ کس طرح K لائن کے اعداد و شمار حاصل کرتا ہے دیکھیں:
لائن 4 سے 7 تک: معاہدے کی قسم اور تجارت کی قسم مقرر کریں، اگر معاہدے کی قسم اور تجارت کی قسم کی ترتیب کامیاب نہ ہو تو غلط واپس کریں
لائن 8: ایک K لائن صف حاصل کریں، جو ایک مقررہ شکل ہے.
لائن 9 سے 11 تک: K لائن کی لمبائی کو فلٹر کریں، کیونکہ ہم KDJ اشارے کا حساب لگانے کے لئے جو پیرامیٹر استعمال کرتے ہیں وہ 9 ہے۔ جب K لائن کی تعداد 9 سے کم ہے تو ، KDJ اشارے کا حساب لگانا ناممکن ہے۔ لہذا یہاں ہم K لائن کی لمبائی کو فلٹر کرنا چاہتے ہیں۔ اگر K لائن 10 سے کم ہے تو ، براہ راست غلط واپس کریں اور اگلی K لائن کا انتظار جاری رکھیں۔
اگلا ، ہمیں KDJ اشارے کی K اور D اقدار کا حساب لگانے کی ضرورت ہے۔ سب سے پہلے KDJ اشارے کی ایک صف حاصل کرنا ضروری ہے ، اور اس صف سے K اقدار اور D اقدار حاصل کریں۔ FMZ کوانٹ پلیٹ فارم پر ، KDJ کی صف حاصل کرنا بہت آسان ہے ، بس KDJ کی API کو کال کریں ، دشواری K اور D اقدار کی قدر حاصل کرنا ہے ، کیونکہ KDJ صف دو جہتی صف ہے۔
دو جہتی صف اصل میں سمجھنے میں آسان ہے ، جو صف کی صف ہے ، حاصل کرنے والی ترتیب یہ ہے: پہلے صف میں مخصوص صف حاصل کریں ، اور پھر مخصوص صف سے مخصوص عنصر حاصل کریں ، جیسا کہ ذیل میں دکھایا گیا ہے:
#include <iostream>
using namespace std;
int main(){
int hour [3][2] = {{100, 50}, {66, 88}, {10, 90}};
cout << hours[0][0]; // get the hours array first elements of first element, the result is 100
cout << hours[0][1]; // get the hours array first elements of second element, the result is 50
cout << hours[1][0]; // get the hours array second elements of first element, the result is 66
return(0);
}
جیسا کہ ذیل میں دکھایا گیا ہے ، 12 ویں لائن براہ راست FMZ Quant کے API کا استعمال کرتے ہوئے KDJ اشارے کی ایک صف حاصل کرتی ہے ، جو دو جہتی صف ہے: arr = [[K قیمت ، K قیمت ، K قیمت... ] ، [D قیمت ، D قیمت ، D قیمت... ] ، [J قیمت ، J قیمت ، J قیمت... ]
لائن 13 پچھلی K لائن کی k قیمت حاصل کرنا ہے ، K قیمت arr [0] ہے ، پھر arr [0] سے penultimate عنصر حاصل کریں ، arr [0].size (() کی صف کی لمبائی حاصل کرنے کے لئے استعمال کیا جاسکتا ہے ، arr [0] ، arr [0].size (() - 2 صف کا دوسرا آخری عنصر ہے ، اسے اکٹھا کریں آٹو k = arr [0] [arr [0].size () - 2 ]؛ لائن 14 اور 15 ایک ہی حساب کتاب ہیں۔
double position = 0; // position status parameter, the default is 0
bool onTick(string symbol){ // onTick function, all strategy logic are in this function
auto ct = exchange.SetContractType(symbol); // set the contract type and trading variety
if(ct == false){ // if the setting contract type and trading variety is not successful
return false; // return false
}
auto r = exchange.GetRecords(); // get the k-line array
if(!r.Valid || r.size() < 10){ // if getting the k-line array or the number of k-line is less than 10
return false; // return false
}
auto arr = TA.KDJ(r, 9, 3, 3); // calculate the KDJ indicator
auto k = arr[0][arr[0].size() - 2]; // get the K value of the previous K line
auto d = arr[1][arr[1].size() - 2]; // get the D value of the previous K line
auto dPre = arr[1][arr[1].size() - 3]; // get the D value of the second last of the K line
}
void main(){ // program starts from here
while (true){ // enter the loop
if (exchange.IO("status") == 0) // if the connection with the exchange if not stable.
sleep(1000); // pause for 1 second
continue; // skip this loop, enter the next loop
}
if(!onTick("this_week")){ // if the connection with the exchange is stable, enter this if loop, start executing the onTick function
sleep(1000); // pause for 1 second
}
}
}
مندرجہ بالا اعداد و شمار کے ساتھ ، ہم اب تجارتی منطق اور آرڈر دینے کا حصہ لکھ سکتے ہیں۔ یہ بھی بہت آسان ہے ، سب سے زیادہ عام طور پر استعمال ہونے والا
double position = 0; // position status parameter, the default is 0
bool onTick(string symbol){ // onTick function, all strategy logic are in this function
auto ct = exchange.SetContractType(symbol); // set the contract type and trading variety
if(ct == false){ // if the setting contract type and trading variety is not successful
return false; // return false
}
auto r = exchange.GetRecords(); // get the k-line array
if(!r.Valid || r.size() < 10){ // if getting the k-line array or the number of k-line is less than 10
return false; // return false
}
auto arr = TA.KDJ(r, 9, 3, 3); // calculate the KDJ indicator
auto k = arr[0][arr[0].size() - 2]; // get the K value of the previous K line
auto d = arr[1][arr[1].size() - 2]; // get the D value of the previous K line
auto dPre = arr[1][arr[1].size() - 3]; // get the D value of the second last of the K line
string action; // define a string variable action
// if currently holding long position, and the previous K line's D value is less than the second last k line's D value, close all position
// if currently holding short position, and the previous K line's D value is greater than the second last k line's D value, close all position
if((d < dPre && position > 0) || (d > dPre && position <0)){
action = "cover";
}else if (k > d && position <= 0){ // if the previous K line's K value is greater than the previous K line's D value, and there are no long positions
action = "buy"; // set the variable action to "buy"
}else if (k < d && position >= 0){ // if the previous K line's K value is less than the previous K line's D value, and there are no short positions
action = "sell"; // set the variable action to "sell"
}
if (action.size() > 0){ // if there are placing order instruction
position = ext::Trade(action, symbol, 1); // calling the C++ trading class library, placing orders according the direction of variable "action". and also renew the position status.
}
return true; // return true
}
}
void main(){ // program starts from here
while (true){ // enter the loop
if (exchange.IO("status") == 0) // if the connection with the exchange if not stable.
sleep(1000); // pause for 1 second
continue; // skip this loop, enter the next loop
}
if(!onTick("this_week")){ // if the connection with the exchange is stable, enter this if loop, start executing the onTick function
sleep(1000); // pause for 1 second
}
}
}
مندرجہ بالا کوڈ میں ، لائنیں 19 سے 28 ٹریڈنگ منطق اور آرڈر دینے کا کوڈ ہیں۔ تاہم ، اس سے پہلے ، ہمیں لائن 16 پر ایک تار متغیر " ایکشن " کی وضاحت کرنے کی ضرورت ہے ، جو آرڈر کی کارروائی کا تعین کرنے میں مدد کے لئے استعمال ہوتا ہے۔
لائن 19 سے لائن 21 ہیں: اگر فی الحال طویل پوزیشن رکھتے ہیں ، اور پچھلی K لائن
لائن 21 سے لائن 25 تک ہیں: طویل اور مختصر پوزیشن کھولنے کی شرائط۔ جب شرط درست ہے ،
لائن 26 سے لائن 28 تک پلیسنگ آرڈر منطق کو انجام دے رہے ہیں۔ سب سے پہلے ، سٹرنگ متغیر
دو مقامات پر نوٹ کرنے کی ضرورت ہے:
کوشش کریں (لیکن لازمی نہیں) حکمت عملی کی منطق لکھیں کیونکہ موجودہ K لائن کی حالت قائم ہے ، پھر آرڈر کو اگلی K لائن پر رکھیں۔ یا پچھلی K لائن کی شرط قائم کی گئی ہے ، موجودہ K لائن پر آرڈر لگائیں ، اس طرح ، بیک ٹیسٹ کا نتیجہ اور حقیقی مارکیٹ کی کارکردگی زیادہ مختلف نہیں ہے۔ اس طرح نہیں لکھنا ٹھیک ہے ، لیکن اس بات پر توجہ دیں کہ حکمت عملی کی منطق درست ہے یا نہیں۔
عام طور پر ، بند پوزیشن کی منطق کو افتتاحی پوزیشن کی منطق کے سامنے لکھنا چاہئے۔ اس کا مقصد یہ ہے کہ حکمت عملی کی منطق کو آپ کی توقعات پر پورا اترنے کی کوشش کریں۔ مثال کے طور پر ، اگر حکمت عملی کی منطق صرف اس صورتحال کو پورا کرتی ہے جہاں اسے صرف ایک پوزیشن کو بند کرنے کے بعد تجارت کی مخالف سمت کرنے کی ضرورت ہوتی ہے تو ، اس طرح کی صورتحال کا اصول یہ ہے کہ پہلے پوزیشن بند کریں اور پھر نئی پوزیشن کھولیں۔ اگر ہم افتتاحی پوزیشن کی منطق کے سامنے بند پوزیشن کی منطق لکھیں تو ، یہ اس اصول کو بالکل پورا کرے گا۔
مندرجہ بالا ہم نے سیکھا کہ کس طرح KDJ تکنیکی اشارے کا تجزیہ کریں اور اسے ایک مکمل مقداری تجارتی حکمت عملی میں تبدیل کریں۔ بشمول: حکمت عملی کا تعارف ، KDJ اشارے کے حساب کتاب کا طریقہ ، حکمت عملی کی منطق ، تجارتی حالات ، حکمت عملی کوڈ کے نفاذ وغیرہ۔ اس حکمت عملی کیس کے ذریعے ، ہم نہ صرف ایف ایم زیڈ کوانٹ پلیٹ فارم پر سی ++ پروگرامنگ کے طریقہ کار سے واقف ہوجاتے ہیں ، بلکہ مختلف حکمت عملیوں کو بھی اس حصے میں معاملات کے مطابق ڈھال سکتے ہیں۔
مقداری تجارتی حکمت عملی کو حاصل کرنے کے لئے اپنے ذاتی مقداری تجارتی تجربے یا نظام کا خلاصہ کرنا ہے ، اور پھر مطلوبہ خام ڈیٹا کو الگ سے حاصل کرنا ہے ، اور حکمت عملی کی منطق کے لئے درکار اعداد و شمار کا حساب کتاب کرنا ہے ، اور آخر میں تجارت کو سمجھنے کے لئے آرڈر دینے والے API کو کال کرنا ہے۔ یہ کہا جاسکتا ہے کہ زیادہ تر سادہ مقداری تجارتی حکمت عملی ان اقدامات کے مطابق لاگو ہوتی ہیں!
اب تک ، اس سلسلے میں حکمت عملی لکھنے کا سبق اختتام پر پہنچا ہے ، مجھے یقین ہے کہ اگر آپ اس مرحلے کے سبق پر عمل کرتے ہیں جو آپ کو یہاں لے جاتا ہے تو ، آپ بہت کچھ حاصل کریں گے۔ کسی بھی صورت میں ، مقداری تجارت کے بنیادی کورسز کے نقطہ نظر سے ، لمبا راستہ آدھے سے زیادہ چلا ہے۔ آخری باب میں ، ہم آپ کو FMZ کوانٹ بیک ٹیسٹنگ ٹریڈنگ ٹولز کو استعمال کرنے کا طریقہ سکھائیں گے ، اور بیک ٹیسٹنگ میں گڑھے سے کیسے بچیں اور حقیقی مارکیٹ ٹریڈنگ کے لئے حتمی تیاری کریں۔ اگرچہ یہ مواد کا ایک چھوٹا سا حصہ ہے ، لیکن یہ مقداری تجارت کی دنیا میں داخل ہونے میں ایک بڑا قدم ہے!
ایف ایم زیڈ کوانٹ پلیٹ فارم پر سی ++ زبان کا استعمال کرتے ہوئے کے ڈی جے اشارے الگورتھم کو نافذ کرنے کی کوشش کریں۔
CCI اشارے کی حکمت عملی بنانے کے لئے اس سیکشن میں علم کا استعمال کرنے کی کوشش کریں.