前回
429 Too Many Requests
よーし次は、PIPS換算。
と思いきや、
1 2 |
// 現在の通貨ペアの小数点以下の桁数を取得 int digits = (int)MarketInfo(Symbol(), MODE_DIGITS); |
MarketInfo関数がMQL5にはない、
と良いページを見つけました。
MQL4からMQL5への移植
ここ をみれば
なんとかなりそうです。
しかもちゃんと
1 2 |
double MarketInfo(string symbol, int type) |
からの移植用に
1 2 |
double MarketInfoMQL4(string symbol, int type) |
てのがありました。
中を見ると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
double MarketInfoMQL4(string symbol, int type) { switch(type) { case MODE_LOW: return(SymbolInfoDouble(symbol,SYMBOL_LASTLOW)); case MODE_HIGH: return(SymbolInfoDouble(symbol,SYMBOL_LASTHIGH)); case MODE_TIME: return(SymbolInfoInteger(symbol,SYMBOL_TIME)); case MODE_BID: return(Bid); case MODE_ASK: return(Ask); case MODE_POINT: return(SymbolInfoDouble(symbol,SYMBOL_POINT)); case MODE_DIGITS: return(SymbolInfoInteger(symbol,SYMBOL_DIGITS)); case MODE_SPREAD: return(SymbolInfoInteger(symbol,SYMBOL_SPREAD)); case MODE_STOPLEVEL: return(SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL)); case MODE_LOTSI ・・・・・・・・・・・・・・・」 |
ってなっているので、
1 2 |
case MODE_DIGITS: return(SymbolInfoInteger(symbol,SYMBOL_DIGITS)); |
を使えば行けそうです。
ポジションプロパティ
こちらを参照。
ポジションタイプの取得
1 2 3 4 5 6 7 8 9 10 |
int pt = PositionGetInteger(POSITION_TYPE); //ポジションタイプ if(pt == POSITION_TYPE_BUY ) { dtemppips = Bid - PositionGetDouble(POSITION_PRICE_OPEN); } else { dtemppips = PositionGetDouble(POSITION_PRICE_OPEN) - Ask; } |
現在の BidとAskの取得方法
1 2 3 4 5 6 7 8 9 10 11 12 |
void OnTick() { MqlTick last_tick; //--- if(SymbolInfoTick(Symbol(),last_tick)) { Print(last_tick.time,": Bid = ",last_tick.bid, " Ask = ",last_tick.ask," Volume = ",last_tick.volume); } else Print("SymbolInfoTick() failed, error = ",GetLastError()); //--- } |
とがんばって計算しようと思ったけど
1 |
Print("選択した注文の損益 :", PositionGetDouble(POSITION_PROFIT)); |
これで利益が取得できる。
なんか、正しく取得できているっぽい。
なのでPOSITION_PROFITで取得した値を
PIPS変換する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//+------------------------------------------------------------------+ //| pointをpipsに換算する関数 //+------------------------------------------------------------------+ string PointToPips(double point) { string strpips; // 現在の通貨ペアの小数点以下の桁数を取得 int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); // 3桁・5桁のFXブローカーの場合 if(digits == 3 || digits == 5) { strpips = DoubleToString(point / 10, 1); } // 2桁・4桁のFXブローカーの場合 if(digits == 2 || digits == 4) { strpips = DoubleToString(point, 1); } return(strpips); } |
これでよしとします。
—-2021/04/22追記—-
全然ダメでした。
POSITION_PROFITで計算すると
0.01ロットであれば適正な値ですが
ロット数が異なれば、割り算する必要があります。
とはいえ、それだと意味合いが異なるでちゃんと
引き算して算出するようにしました。
しかーし、
こんな結果に。
うう、よくわからんが
SymbolInfoTick()で取得した値はEURJPYで
PositionGetDouble(POSITION_PRICE_OPEN)はEURUSDだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
MqlTick last_tick; //--- if(SymbolInfoTick(Symbol(), last_tick)) { // Print(last_tick.time, ": Bid = ", last_tick.bid, " Ask = ", last_tick.ask, " Volume = ", last_tick.volume); } else Print("SymbolInfoTick() failed, error = ", GetLastError()); if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) //ポジションタイプ { dtemppips = last_tick.bid - PositionGetDouble(POSITION_PRICE_OPEN); } else { dtemppips = PositionGetDouble(POSITION_PRICE_OPEN) - last_tick.ask; } // Print("dtemppips :", dtemppips); // Print("DigitsValue :", DigitsValue); dtemppips *= DigitsValue; // Print("PIPS(dtemppips) :", dtemppips); Print(last_tick.time,"OPEN= ",PositionGetDouble(POSITION_PRICE_OPEN)," : dtemppips= ",dtemppips," DigitsValue=",DigitsValue, ": Bid = ", last_tick.bid, " Ask = ", last_tick.ask, " Volume = ", last_tick.volume); |
うーーん、この原因を究明する
よりちょっとスッキリしないけど
POSITION_PROFIT作戦に戻す。
よくわからんが、100掛けてから割れば
うまくいくのでこれで良しとします。
1 2 3 4 5 6 7 8 9 10 11 |
//-------------------------------------------------------------------------------- //PIPSの算出 //-------------------------------------------------------------------------------- tempvolume = PositionGetDouble(POSITION_VOLUME) * 100; // Print("tempvolume = ", tempvolume, "PositionGetDouble(POSITION_VOLUME) = ", PositionGetDouble(POSITION_VOLUME)); dtemppips = PointToPips(PositionGetDouble(POSITION_PROFIT) / tempvolume); //手数料とスワップは? double fee = 0; |
後は、手数料とスワップのあるチャートで適正値を入れ込む予定です。
—-2021/06/05追記—-
MT5の場合、Goldが1桁ずれていました。
MT4と同じロジックにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
bOrderType = (int)PositionGetInteger(POSITION_TYPE); //オーダータイプ // Print("選択した注文のチケット番号 :", PositionGetInteger(POSITION_TICKET)); // DigitsValue = MathPow(10, MarketInfo(OrderSymbol(), MODE_DIGITS) - 1); //小数点以下の桁数 MqlTick last_tick; //--- if(SymbolInfoTick(PositionGetString(POSITION_SYMBOL), last_tick)) { // Print(last_tick.time, ": Bid = ", last_tick.bid, " Ask = ", last_tick.ask, " Volume = ", last_tick.volume); } else Print("SymbolInfoTick() failed, error = ", GetLastError()); if(bOrderType == POSITION_TYPE_BUY) //ポジションタイプ { dtemppips = last_tick.bid - PositionGetDouble(POSITION_PRICE_OPEN); } else { dtemppips = PositionGetDouble(POSITION_PRICE_OPEN) - last_tick.ask; } // Print("dtemppips :", dtemppips); int digits = (int)SymbolInfoInteger(PositionGetString(POSITION_SYMBOL), SYMBOL_DIGITS); DigitsValue = MathPow(10, digits - 1); // Print("DigitsValue :", DigitsValue, "digits :", digits); dtemppips *= DigitsValue; // 3桁・5桁のFXブローカーの場合 if(digits == 3 || digits == 5) { // dtemppips /= 10; } // 2桁・4桁のFXブローカーの場合はそのまま // Print(last_tick.time, "OPEN= ", PositionGetDouble(POSITION_PRICE_OPEN), ": Bid = ", last_tick.bid, " Ask = ", last_tick.ask, " : dtemppips= ", dtemppips, " DigitsValue=", DigitsValue, " Volume = ", last_tick.volume); //-------------------------------------------------------------------------------- //PIPSの算出 //-------------------------------------------------------------------------------- /* tempvolume = PositionGetDouble(POSITION_VOLUME) * 100; // Print("tempvolume = ", tempvolume, "PositionGetDouble(POSITION_VOLUME) = ", PositionGetDouble(POSITION_VOLUME)); dtemppips = PointToPips(PositionGetDouble(POSITION_PROFIT) / tempvolume); //手数料とスワップは? */ // Print("選択した注文のスワップ :", PositionGetDouble(POSITION_SWAP)); //-------------------------------------------------------------------------------- //PIPSをチャート画面に表示する //-------------------------------------------------------------------------------- //手数料とスワップを加味する // Print("選択した注文の手数料 :", OrderCommission()); // Print("選択した注文のスワップ :", OrderSwap()); double fee = (PositionGetDouble(POSITION_SWAP) + PositionGetDouble(POSITION_COMMISSION)) / DigitsValue; |
つぎはこちら
429 Too Many Requests