🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

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

Q&A

1回答

3289閲覧

【MQL4】OrdersTotal()で取得した通貨ペアでグループ分けをしたい。

t-_.

総合スコア55

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

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

0グッド

0クリップ

投稿2019/09/05 17:18

編集2019/09/05 18:37

前提・実現したいこと

概要
売買をしたら、設定した損失パーセントにラインを引く

実現したいこと
仕掛けているポジションを取得しているので、その通貨ペアごとに資金管理がしたいです。

現在の機能
ドル円で仕掛けたら、損失3%のラインに引く。
ポン円で仕掛けたら、ドル円とポン円のを組み合わせた(全ポジション)の3%にラインを引いてしまう。

これをドル円はドル円のい3%に。
ポン円はポン円の3%にしたいです。

ずっと考えてたんですが、まったく浮かばなかったです。
ご教授いただければ幸いです。

###ソースコード

mql

1//+------------------------------------------------------------------+ 2//| FundM.mq4 | 3//| Copyright 2019, MetaQuotes Software Corp. | 4//| https://www.mql5.com | 5//+------------------------------------------------------------------+ 6#property copyright "Copyright 2019, MetaQuotes Software Corp." 7#property version "1.00" 8#property strict 9#property indicator_chart_window 10 11#include <stdlib.mqh> 12 13/* User入力初期値 */ 14extern double FundValue = 3 ; //損失パーセント 15extern bool LineView = true ; //損切りラインの表示 16extern color Color = clrRed ; //ラインの色 17extern int Thickness = 2 ; //ラインの太さ 18 19/* 初期値 */ 20double AccountValue = 0 ; //口座残高 21int PipsExValue = 100 ; //Pipsの正規化・・・ではないけど。 22double LossValue = 0 ; //損失値 23double LossPips = 0 ; //損失Pips数 24double StopRate = 0 ; //損失値の値段 25int SleepTime = 100 ; //処理落ち対策 いや、しないと思うけどねw 26 27double Difference[ 50 ] = { 0 } ; //ポジション間の差額 :最大50枚 28double OpenPrice[ 50 ] = { 0 } ; //ポジションの注文値 :最大50枚 29double MultiDif[ 50 ] = { 0 } ; 30double AllLossPrice = 0 ; //全ての損失値 31double AllDifference = 0 ; //全ての差額 32int FirstPosition = 0 ; //最初に注文したポジション番号 33 34long CharId = 101 ; //チャートID 35string StopStr = "StopLine" ; //ライン名 36int SubWindow = 0 ; //チャート番号 37datetime DateTime = 0 ; //時間指定 38int AnchorPoint = 0 ; //アンカーポイント 39double Price = 0 ; //値段 40 41double LastPosi = 0 ; 42double LimitPrice[ 50 ] = { 0 } ; 43double AllLossPips = 0 ; 44 45double SLLine = 0 ; 46double MaxLots = 0 ; 47double Lots[ 50 ] = { 0 } ; 48 49double Digit, DigitsValue; 50/* 初期設定 */ 51int OnInit() 52{ 53 54 Digit = Digits() - 1 ; 55 DigitsValue = MathPow( 10, Digit ) ; 56 57 return( INIT_SUCCEEDED ) ; 58} 59void deinit() 60{ 61 ObjectDelete( StopStr ); 62} 63 64/* StopLossを設定 */ 65void StopSet( double Pips ) 66{ 67 AllLossPips = 0 ; 68 MaxLots = 0 ; 69 for( int i = OrdersTotal()-1 ; i >= 0; i-- ) 70 { 71 if( OrderSelect( i, SELECT_BY_POS ) != True ) 72 ErrorCode() ; 73 74 /* Buy */ 75 if( OrderType() == OP_BUY ) 76 { 77 Lots[ i ] = OrderLots(); 78 MaxLots += OrderLots(); 79 OpenPrice[ i ] = OrderOpenPrice() ; 80 /* ポジが一つの時のみ */ 81 if( OrdersTotal() == 1 ) 82 { 83 StopRate = Pips / OrderLots() ; 84 StopRate = OrderOpenPrice() - NormalizeDouble( StopRate * Point, 4 ) ; 85 }else{ 86 if( i != 0 ) 87 { 88 Difference[ i ] = OpenPrice[ FirstPosition ] - OpenPrice[ i ] ; 89 Difference[ i ] = NormalizeDouble( Difference[ i ] * DigitsValue, Digits() ) ; 90 MultiDif[ i ] = Difference[ i ] * Lots[ i ] ; 91 } 92 //Print( "Multi : " + MultiDif[i] + " Dif : " + Difference [i] ); 93 AllLossPips += MultiDif[ i ] ; 94 95 Pips -= AllLossPips ; 96 StopRate = Pips / MaxLots ; 97 StopRate = NormalizeDouble( StopRate, Digits() ); 98 StopRate = OpenPrice[ OrdersTotal() - 1 ] - StopRate * Point ; 99 //Print( StopRate ); 100 } 101 102 if( LineView ) 103 BorderLine( StopRate ) ; 104 105 if( OrdersTotal() == 0 ) 106 ObjectDelete( StopStr ) ; 107 } 108 109 /* Short */ 110 else if( OrderType() == OP_SELL ) 111 { 112 Lots[ i ] = OrderLots(); 113 MaxLots += OrderLots(); 114 OpenPrice[ i ] = OrderOpenPrice() ; 115 /* ポジが一つの時のみ */ 116 if( OrdersTotal() == 1 ) 117 { 118 StopRate = Pips / OrderLots() ; 119 StopRate = OrderOpenPrice() + NormalizeDouble( StopRate * Point, 4 ) ; 120 }else{ 121 if( i != 0 ) 122 { 123 Difference[ i ] = OpenPrice[ FirstPosition ] - OpenPrice[ i ] ; 124 Difference[ i ] = NormalizeDouble( Difference[ i ] * DigitsValue, Digits() ) ; 125 MultiDif[ i ] = Difference[ i ] * Lots[ i ] ; 126 } 127 AllLossPips += MultiDif[ i ] ; 128 129 Pips -= AllLossPips ; 130 StopRate = Pips / MaxLots ; 131 StopRate = NormalizeDouble( StopRate, Digits() ); 132 StopRate = OpenPrice[ OrdersTotal() - 1 ] + StopRate * Point ; 133 } 134 135 if( LineView ) 136 BorderLine( StopRate ) ; 137 138 if( OrdersTotal() == 0 ) 139 ObjectDelete( StopStr ) ; 140 } 141 Sleep( SleepTime ) ; 142 } 143} 144 145/* 口座残高を取得し、指定したパーセント分のPipsを計算 */ 146double Calc() 147{ 148 AccountValue = AccountBalance() ; 149 150 LossValue = AccountValue * ( FundValue / PipsExValue ) ; 151 LossPips = LossValue / PipsExValue ; 152 153 154 return NormalizeDouble( LossPips, Digits() ) ; 155} 156 157void BorderLine( double StopLine ) 158{ 159 ObjectCreate( StopStr, OBJ_HLINE, SubWindow, DateTime, Price ) ; //Chart_idがあると動かんw 160 161 ObjectSet( StopStr, OBJPROP_COLOR, Color ) ; 162 ObjectSet( StopStr, OBJPROP_STYLE, STYLE_DOT ) ; 163 ObjectSet( StopStr, OBJPROP_WIDTH, Thickness ) ; 164 165 ObjectMove( StopStr, AnchorPoint, DateTime, StopLine ) ; 166} 167 168/* エラーコード出力 */ 169void ErrorCode() 170{ 171 Print( ErrorDescription( GetLastError())) ; 172} 173 174int OnCalculate(const int rates_total, 175 const int prev_calculated, 176 const datetime &time[], 177 const double &open[], 178 const double &high[], 179 const double &low[], 180 const double &close[], 181 const long &tick_volume[], 182 const long &volume[], 183 const int &spread[]) 184{ 185 StopSet( Calc() ) ; 186 187 return( rates_total ); 188} 189

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

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

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

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

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

guest

回答1

0

自分はこうやって通貨毎の損益を集計しています。


double USDJPY_PF = 0;
double GBPJPY_PF = 0;
int PosTotal = PositionsTotal();

for(int i=PosTotal-1; i>=0; i--) {
//USDJPY
if(PositionGetSymbol(i)=="USDJPY") {
PositionGetTicket(i);
USDJPY_PF += PositionGetDouble(POSITION_PROFIT);
}
//GBPJPY
if(PositionGetSymbol(i)=="GBPJPY") {
PositionGetTicket(i);
GBPJPY_PF += PositionGetDouble(POSITION_PROFIT);
}
}

投稿2019/09/17 23:21

srkw

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問