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

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

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

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

Q&A

解決済

1回答

3151閲覧

損益をpipsへ変換

nisei2

総合スコア19

MQL4

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

0グッド

0クリップ

投稿2020/12/01 14:14

編集2020/12/05 20:30

前提・実現したいこと

取得した損益をpipsへ変換したい

発生している問題・エラーメッセージ

サイトを参考にしたコードで損益は取得できており、その損益を使用しpipsへ変換しようとしているが変換できない。 このような感じに表示され、pipsの方は桁数が多くなります。 損益2690 pips269000

該当のソースコード

MQL4

1/*-------------------------//損益-------------------------*/ 2 3 ObjectCreate("profit_loss",OBJ_LABEL,0,0,0); 4 ObjectSet("profit_loss",OBJPROP_CORNER,CORNER_LEFT_UPPER); 5 ObjectSet("profit_loss",OBJPROP_XDISTANCE,X); 6 ObjectSet("profit_loss",OBJPROP_YDISTANCE,Y+200); 7 8 if(Profit_Loss() >= 0) 9 ObjectSetText("profit_loss","損益:"+Profit_Loss(),font_size,"MS ゴシック",clrYellow); 10 11 if(Profit_Loss() < 0) 12 ObjectSetText("profit_loss","損益:"+Profit_Loss(),font_size,"MS ゴシック",clrRed); 13 14/*-------------------------//PIPS-------------------------*/ 15 16 ObjectCreate("price_to_pips",OBJ_LABEL,0,0,0); 17 ObjectSet("price_to_pips",OBJPROP_CORNER,CORNER_LEFT_UPPER); 18 ObjectSet("price_to_pips",OBJPROP_XDISTANCE,X); 19 ObjectSet("price_to_pips",OBJPROP_YDISTANCE,Y+250); 20 21 if(PriceToPips(Profit_Loss()) >= 0) 22 ObjectSetText("price_to_pips","PIPS:"+PriceToPips(Profit_Loss()),font_size,"MS ゴシック",clrYellow); 23 24 if(PriceToPips(Profit_Loss()) < 0) 25 ObjectSetText("price_to_pips","PIPS:"+PriceToPips(Profit_Loss()),font_size,"MS ゴシック",clrRed); 26 27/*-------------------------//上記のコードを使用した一文-------------------------*/ 28ObjectSetText("price_to_pips","PIPS:"+PriceToPips(Profit_Loss()),font_size,"MS ゴシック",clrYellow);

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

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

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

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

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

mah

2020/12/04 15:08

> サイトを参考にしたコード どのサイトでしょう?PriceToPipsで検索して出てくるサイトのPriceToPipsの処理は「値幅」をPipsに変換する処理です。 また、Profit_Loss関数の処理が不明ですが、損益を計算する過程でPipsはわかるのでは? それと、ソースはcodeタグで囲みましょう。
nisei2

2020/12/05 20:41

値幅だったんですね、気づきませんでしたありがとうございます。 ヒントを教えてもらったのですが損益額をpipsに変換する方法はわかりませんでした。 関数の処理は下記になります。 double Profit_Loss() { double profit_loss = NULL; int position = NULL; for(position=0; position < OrdersTotal(); position++) { OrderSelect(position, SELECT_BY_POS); if(OrderSymbol() == Symbol()) { if(OrderType() == OP_BUY || OrderType() == OP_SELL ) { profit_loss = profit_loss + OrderProfit(); return(profit_loss); } } } return(0); }
guest

回答1

0

ベストアンサー

OrderOpenPriceで約定価格を取得できるので、それで値幅を計算してPriceToPipsに渡せばPipsになるでしょう。

MQL4

1// https://minagachi.com/price-to-pips 2double PriceToPips(double price) 3{ 4 double pips = 0; 5 6 // 現在の通貨ペアの小数点以下の桁数を取得 7 int digits = (int)MarketInfo(Symbol(), MODE_DIGITS); 8 9 // 3桁・5桁のFXブローカーの場合 10 if(digits == 3 || digits == 5) 11 { 12 pips = price * MathPow(10, digits) / 10; 13 } 14 // 2桁・4桁のFXブローカーの場合 15 if(digits == 2 || digits == 4) 16 { 17 pips = price * MathPow(10, digits); 18 } 19 20 // 少数点以下を1桁に丸める(目的によって桁数は変更する) 21 pips = NormalizeDouble(pips, 1); 22 23 return(pips); 24} 25 26double Profit_Loss_Pips() 27{ 28 double pips = 0; 29 30 for (int position = 0; position < OrdersTotal(); position++) 31 { 32 OrderSelect(position, SELECT_BY_POS); 33 34 if (OrderSymbol() == Symbol()) 35 { 36 double lots = OrderLots(); 37 38 double profit_point = 0; 39 40 if (OrderType() == OP_BUY) 41 { 42 profit_point = Bid - OrderOpenPrice(); 43 } 44 else if (OrderType() == OP_SELL) 45 { 46 profit_point = OrderOpenPrice() - Ask; 47 } 48 49 pips += PriceToPips(profit_point); 50 } 51 } 52 53 return pips; 54}

投稿2020/12/06 02:40

mah

総合スコア591

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

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

nisei2

2020/12/06 12:40

ありがとうございます。pipsを取得することができました!
nisei2

2020/12/06 19:20

なんどもすいません。 pips表示で小数点以下をもっと短く表示したいのですが 9.69999999999みたいに表示されてしまいます。 IndicatorDigitsを使ってみたりしてるのですがうまく表示できません。 なにかほかの関数を使わないとダメなのでしょうか?
mah

2020/12/07 00:23

DoubleToStrやStringFormatを試してください。
nisei2

2020/12/08 08:26

DoubleToStrでなんとかできました!ありがとうございます! 現在ポジションを持っておりロット数も同じような現象(0.07000000000のような状態) が起きていたのでDoubleToStrを使ってみたのですがロット数は改善できませんでした。 教えていただいた関数でpipsをなおせたので使う関数はこれでいいと思うのですが、 プログラム的に再びポジションを取り直さないと反映されない等あるのでしょうか?
mah

2020/12/08 10:43

ObjectCreateとかで作ったラベルとかなら作り直さないと反映されないんじゃないでしょうか?
nisei2

2020/12/10 09:15

わかりました。作り直してみます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問