はじめに
多くの自動売買ツール(EA)は、購入価格からのピップ数を基にテイクプロフィットを設定します。しかし、EA Perceptronが使用するコードは、現在の利益を主に基準にしています。このアプローチにより、複数のポジションを持っている場合でも、マジックナンバーに基づいて現在の総利益を簡単に管理できます。複数のボットインスタンスや異なるEAを同時に使用している場合でも便利です。ぜひ、友達に追加して最新情報をフォローしてください!
このコードを使用することで、ピップに基づくテイクプロフィットを使った際に発生する可能性のある問題に対処できます。たとえば、ブローカーのスリッページによってピップベースのテイクプロフィットが変動し、利益が制限されることがありますが、現在の利益に基づくコードを使用することで、この問題を回避し、取引の管理をよりコントロールできます。
現在の利益に基づくテイクプロフィットの設定方法をさらに学びたい場合は、EA SwingBotのコードを参考にしてください。
…
総注文数の計算
まず、同じマジックナンバーを持つオープンオーダーの総数を計算するコードを見てみましょう。
マジックナンバーは、トレーダーやEA(エキスパートアドバイザー)によってオーダーに付与される一意の識別子です。
このコードは、変数total_ordersをゼロで初期化します。次に、forループを使用してすべてのオープンオーダーをループし、OrderSelect()関数を使用して各オーダーを選択します。オーダーが正常に選択された場合、total_orders変数を1増加させます。
//----------------- int total_orders = 0; for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == MagicNumber) { total_orders++; } } }
…
現在の利益の計算
このコードでは、2つの変数ProfittoMinimoとProfitを初期化します。ProfittoMinimoは、このレベルでテイクプロフィットをアクティブにするために使用され、アカウントの通貨で表されます。Profit変数は、同じマジックナンバーを持つすべてのオープンポジションの現在の利益を累積するために使用されます。変数StopLossは、ストップロスに使用されます。
コードは、OrdersTotal()関数を使用してすべてのオープンポジションを反復処理するためにforループを使用します。各オープンポジションについて、対応するオーダーがOrderSelect()関数を使用して選択されます。オーダーが正常に選択され、同じマジックナンバーを持つ場合、そのオーダーの利益がProfit変数に追加されます。
double ProfittoMinimo = 3; // 目標利益 double Profit = 0; // 現在の利益 for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == MagicNumber) // 複数のEAがある場合は、MagicNumberフィルターを削除して総オーダーを維持できます { Profit += OrderProfit(); } } }
最小利益は外部変数として設定でき、EAのオプションで設定可能です:

…
利益が達成された場合のポジションのクローズ
このコードは、OrdersTotal()関数を使用してすべてのオープンオーダーを反復処理するためにforループを使用します。ループは最後のオーダーから始まり、最初のオーダーまで上がります。各オーダーについて、対応するトレードがOrderSelect()関数を使用して選択されます。
選択されたトレードが現在のチャートと同じシンボルであり、タイプがOP_BUYで、コードで指定されたマジックナンバーと同じである場合、トレードのProfitがProfittoMinimo以上であるかどうかを確認します。そうであれば、OrderClose()関数を使用してビッド価格でトレードをクローズし、買いオーダーがクローズされたことを示すメッセージを出力します。
同様に、選択されたトレードが現在のチャートと同じシンボルであり、タイプがOP_SELLで、コードで指定されたマジックナンバーと同じであれば、トレードのProfitがProfittoMinimo以上であるかどうかを確認します。そうであれば、OrderClose()関数を使用してアスク価格でトレードをクローズし、売りオーダーがクローズされたことを示すメッセージを出力します。
for(int e = OrdersTotal() - 1; e >= 0; e--) { if(OrderSelect(e, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber) // オーダーは現在のオーダーのMagicNumberと一致する場合のみ変更されます。 { if(Profit >= ProfittoMinimo) { OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // ビッド価格 Print("買いオーダーがクローズされました", Profit, " - ストップロス最小: ",MarketInfo(Symbol(), MODE_STOPLEVEL)); } } if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber) { if(Profit >= ProfittoMinimo) { OrderClose(OrderTicket(), OrderLots(), ND(OrderClosePrice()), 3); // アスク価格 Print("売りオーダーがクローズされました", Profit, " - ストップロス最小: ",MarketInfo(Symbol(), MODE_STOPLEVEL)); } } } }
…
まとめ
このコードは、テイクプロフィットに基づくすべてのポジションクローズ戦略に役立ちますが、現在の利益に基づくトレーリングストップと組み合わせることも可能です。このシステムは、複数のエキスパートアドバイザーがある場合にも便利です。MagicNumberに関するif条件を除外すれば、すべてのアクティブなEAからすべてのオープンポジションを同時に管理するための一般的なテイクプロフィットレベルを設定できます。