どうも潤奈です( ゚Д゚)
今回はエントリーしているポジションを取得する為のオリジナル関数を紹介します。
オリジナル関数って?という方はこちらのEA講座でオリジナル関数の説明をしていますので覗いてみて下さい。
コード全文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//ポジション数を取得 int Position(int PositionDirection){ int res=0; for(int i=0;i<OrdersTotal();i++){ if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue; if(OrderMagicNumber()!=MagicNumber)continue; if(OrderSymbol()!=_Symbol)continue; if(PositionDirection==0){ if(OrderType()==OP_BUY)res++; if(OrderType()==OP_SELL)res++; }else if(PositionDirection==1){ if(OrderType()==OP_BUY)res++; }else if(PositionDirection==-1){ if(OrderType()==OP_SELL)res++; } } return(res); } |
現在保持しているポジション数を買いと売りと両方に分けてカウントする関数になります。
Position(1)→買いエントリー数をカウント
Position(-1)→売りエントリー数をカウント
Position(0)→買いと売り両方のエントリー数をカウント
1 2 3 4 |
//ポジション数を取得 int Position(int PositionDirection){ } |
まずint型のPosition関数と関数内で使用する型(int)と引数(PositionDirection)を宣言します。
1 |
int res=0; |
次に計算したポジション数を入れる変数に0を代入してリセットしておきます。
1 2 3 4 5 |
for(int i=0;i<OrdersTotal();i++){ //ここに次のコードを記述 } |
for文で現在保持している総ポジション数までループ処理で、該当するポジションを探します。
1 2 3 |
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue; if(OrderMagicNumber()!=MagicNumber)continue; if(OrderSymbol()!=_Symbol)continue; |
for文の中にこのコードを記述します。上から、if文で確認して問題があれば下の処理をスキップして次のループ処理へ進みます(continue)。
1行目は、正しくポジションを取得出来なかったら→continue
2行目は、対象のマジックナンバーでなければ→continue
3行目は、対象の通貨ペアでなければ→continue
この3つの条件をクリアして、取得出来たポジションで、対象のマジックナンバーで、対象の通貨ペアのポジションのみ下のコードへ進めます。
1 2 3 4 5 6 7 8 9 10 |
if(PositionDirection==0){ if(OrderType()==OP_BUY)res++; if(OrderType()==OP_SELL)res++; }else if(PositionDirection==1){ if(OrderType()==OP_BUY)res++; }else if(PositionDirection==-1){ if(OrderType()==OP_SELL)res++; } |
まずif文とelse if文で両方のポジション合計数か、買いポジション数か売りポジション数かを確認します。
その確認したいポジションのif文内に入ったら、OrderType()で直近のOrderSelect()で取得したポジションの方向(買いor売り)を取得しif文で確認して、該当する場合にresに+1を計算します。
1 |
return(res); |
最後に計算された数をreturnで返します。
まとめ
いかがでしたでしょうか。
これを応用して上手くプログラムの中に組み込んでみて下さい。
注意としてはMagicNumber変数はご自身のマジックナンバーを入れている変数名に変更して下さい。
では、少しでも参考になれば( ゚Д゚)
コメント