前提・実現したいこと
ロット数を自動で計算してメインチャート上に表示したい。
またLOTBとLOTSをひとまとめにしたい。
直近が最高値の場合LOTS、最安値の場合LOTBだけを表示した。
発生している問題・エラーメッセージ
計算結果が1.975000000000016e-06のようになってしまう。
該当のソースコード
MQL4
1#property copyright "Copyright 2020, MetaQuotes Software Corp." 2#property link "https://www.mql5.com" 3#property version "1.00" 4#property strict 5#property indicator_chart_window//チャート上に表示する 6 7extern int ATR_Period=10; 8extern double kyou = 1;//許容パーセント 9 10///////////////////////////////////////////////////////////// 11int OnInit() 12 { 13 ObjectCreate(0,"SPREAD",OBJ_LABEL,0,0,0); 14 ObjectSet("SPREAD",OBJPROP_CORNER,1); 15 ObjectSet("SPREAD",OBJPROP_YDISTANCE,1); 16 17 ObjectCreate("ATR",OBJ_LABEL,0,0,0); 18 ObjectSet("ATR",OBJPROP_CORNER,1); 19 ObjectSet("ATR",OBJPROP_YDISTANCE,15); 20 21 ObjectCreate(0,"LOTB",OBJ_LABEL,0,0,0); 22 ObjectSet("LOTB",OBJPROP_CORNER,1); 23 ObjectSet("LOTB",OBJPROP_YDISTANCE,50); 24 25 ObjectCreate(0,"LOTS",OBJ_LABEL,0,0,0); 26 ObjectSet("LOTS",OBJPROP_CORNER,1); 27 ObjectSet("LOTS",OBJPROP_YDISTANCE,70); 28 29 return(INIT_SUCCEEDED); 30 } 31 32///////////////////////////////////////////////////////////// 33int OnCalculate(const int rates_total, 34 const int prev_calculated, 35 const datetime &time[], 36 const double &open[], 37 const double &high[], 38 const double &low[], 39 const double &close[], 40 const long &tick_volume[], 41 const long &volume[], 42 const int &spread[]) 43 { 44 45 //最高値 46 int highestprice = iHighest(NULL,PERIOD_D1,MODE_HIGH,20,1); 47 48 //最高値の4本値 49 double highestH = iHigh(NULL,0,highestprice); 50 double highestL = iLow(NULL,0,highestprice); 51 52 //最安値 53 int cheapestprice = iLowest(NULL,PERIOD_D1,MODE_LOW,20,1); 54 55 //最安値の4本値 56 double cheapestH = iHigh(NULL,0,cheapestprice); 57 double cheapestL = iLow(NULL,0,cheapestprice); 58 59 int pipbairitu=0; 60 int spbairitu=0; 61 if(Digits==5) 62 { 63 pipbairitu=10000; 64 spbairitu=10; 65 } 66 if(Digits==4)pipbairitu=1000; 67 if(Digits==3) 68 { 69 pipbairitu=100; 70 spbairitu=10; 71 } 72 if(Digits==2)pipbairitu=10; 73 74 //口座情報 75 double kouza = AccountBalance(); 76 77 //買いの損切幅 78 double sonB = cheapestH-cheapestL; 79 80 //売りの損切幅 81 double sonS = highestH-highestL; 82 83 //ロット値の取得 買いの場合 84 double lotB = sonB/(kouza*kyou/100); 85 86 //ロット値の取得 売りの場合 87 double lots = sonS/(kouza*kyou/100); 88 89 //文字列の連結 買いの場合 90 string lotstextB=StringConcatenate("LOTB:",lotB); 91 ObjectSetText("LOTB",lotstextB,10,NULL,White); 92 93 //文字列の連結 売りの場合 94 string lotstextS=StringConcatenate("LOTS:",lots); 95 ObjectSetText("LOTS",lotstextS,10,NULL,White); 96 97///////////////////////////////////////////////////////////// 98 //スプレッド値の取得 99 double Sp =MarketInfo(Symbol(),MODE_SPREAD)/ spbairitu; 100 101 //文字列の連結 102 string sptext=StringConcatenate("SPREAD :",Sp); 103 ObjectSetText("SPREAD",sptext,10,NULL,White); 104 105///////////////////////////////////////////////////////////// 106 //小数点以下を丸める 107 double atr=MathRound(iATR(NULL,0,ATR_Period,0)*pipbairitu); 108 109 //文字列の連結 110 string atrtext=StringConcatenate("ATR(",ATR_Period,"):",atr,"(pips)"); 111 ObjectSetText("ATR",atrtext,10,NULL,White); 112 113 return(rates_total); 114 }
試したこと
高値ー安値=ロウソク足一本分のPIPS(損切幅)
口座残高×1%(リスク許容率)=リスク許容額
ちゃんとこの計算式通りになっているかの確認。
そもそも計算式がおかしいのでしょうか?
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/11 09:28