質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

2937閲覧

ロット数の計算方法。

nisei2

総合スコア19

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2020/09/10 21:30

前提・実現したいこと

ロット数を自動で計算してメインチャート上に表示したい。
また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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

計算結果が1.975000000000016e-06のようになってしまう。

値が小さいため指数表記になっています。

高値ー安値=ロウソク足一本分のPIPS(損切幅)
口座残高×1%(リスク許容率)=リスク許容額

高値-安値の部分ですが、表示しているシンボルによって単位が円だったりドルだったりしますよね。
計算する場合は口座の基本通貨と合わせる必要があります。
また、1ロットのサイズも業者によって異なる場合があります。(大抵の場合は1Lot=10万通貨)
MarketInfo関数で1ロットの通貨数を取得したほうが良いと思います。

口座の通貨を円と仮定して計算してみました。
業者によってシンボル名がUSDJPY_MTやUSDJPY-cdなどになっている場合があるので、その部分は変更して下さい。
計算の流れとしては、通貨単位(円)で計算し、1ロットの通貨数で割ってロット数にしています。

MQL

1 // EURUSDやEURCHF等の場合はUSDJPYやCHFJPYのレートを取得し、単位を円に変換 2 if (SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT) != "JPY") 3 { 4 // 対応する通貨を取得 5 string cross_yen = SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT) + "JPY_MT"; 6 7 // 現在のレートを取得 8 double rate = iClose(cross_yen, PERIOD_CURRENT, 0); 9 10 // 単位を円に変換 11 sonB *= rate; 12 sonS *= rate; 13 } 14 15 // ロット値の取得 買いの場合 16 //double lotB = sonB / (kouza * kyou / 100); 17 double lotB = (kouza * kyou / 100) / sonB / MarketInfo(Symbol(), MODE_LOTSIZE); 18 19 // ロット値の取得 売りの場合 20 //double lots = sonS / (kouza * kyou / 100); 21 double lots = (kouza * kyou / 100) / sonS / MarketInfo(Symbol(), MODE_LOTSIZE);

一応確認はこのサイトでしました。(https://www.myfxbook.com/forex-calculators/position-size)

投稿2020/09/11 05:50

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nisei2

2020/09/11 09:28

いつも答えていただいてありがとうございます。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問