
クロスプラットフォームEA: ストップ
コンテンツ表
- イントロダクション
- COrder
- CStop
- CStops
- COrderStop
- COrderStops
- ストップのチャート表現
- オーダーストップチェック
- サンプル
- 結論
- この記事で使用されるプログラム
- この記事で紹介されているクラスファイル
イントロダクション
以前の記事で説明したように、クロスプラットフォームのEA に関するオーダーマネージャ (COrderManager) を作成しています。 どちらのバージョンでも、EAはCOrderのインスタンスを作成することによって、トレード情報をメモリに保存します。 このクラスオブジェクトのインスタンスへの動的ポインターのコンテナは、COrderManager のクラスメンバーとしても使用できます (現在および過去のトレードの両方)。
オーダーマネージャーは、各トレードのストップを直接処理することができます。 ただし、一定の制限があります。
- COrderManager は、ほとんどの場合、各トレードのストップをどのように処理するかをカスタマイズするために拡張する必要があります。
- COrderManager の既存のメソッドは主要なトレードの記入項目にだけ対処します。
COrderManager は、各トレードのストップを独自に処理できるように拡張することができます。 しかし、実際のレベルの配置に限られていないだけでなく、ストップの監視に関連する他のタスクにも、変更やチェックなどがあります。 この関数は、分割実装に対応していない現在の COrderManager をはるかに複雑にします。
オーダーマネージャは、主なトレードのエントリを扱い, 保留中のオーダーの配置など、他のトレード操作を実行する必要があります。 オーダーマネージャが独自に処理することは可能ですが、メインのトレードのエントリにフォーカスし、別のクラスオブジェクトがストップを処理できるようにすることをお勧めします。
この記事では、COrderManager がトレードのエントリと決済を処理する実装について説明し (現在のところ)、別のクラスオブジェクト (CStop) によって個別に処理されるストップの実装をします。
COrder
以前の記事 (「クロスプラットフォームEA: オーダー」を参照) から学んだように、COrderのインスタンスは、トレードの成功 (エントリ) の後に作成されます。 MetaTrader4とMetaTrader5については、ストップロス とテイクプロフィットに関する情報は、ブローカーから保存することができます。 ただし、ストップがブローカーから非表示になっている場合、または複数のストップが関係している場合は、ストップのほとんどに関する情報をローカルに保存する必要があります。 したがって、後者の場合には、ポジションのエントリが成功した後で、COrderインスタンスを最初に作成し、その後にその ストップロス とテイクレベルを表すオブジェクトインスタンスを指定する必要があります。 以前の記事では、次の図に示すように、COrderインスタンス作成時にオーダーマネージャに追加するメソッドを示しました。
このストップは、同じメソッドで追加されます。 これを行うには、新しいCOrderインスタンスが作成された後、現在進行中のトレード (COrders) のリストに追加される前に、メソッドを挿入するだけで済みます。 したがって、次の図に示すように、上記の図をわずかに変更する必要があります。
ストップの作成の一般的な操作を次の図に示します。
前述の2つのフローチャートに示されているように、トレードが正常にエントリーされるとすぐに、新しいCOrderインスタンスが作成されます。 その後、定義された ストップロス およびテイクレベルに対して COrderStop のインスタンスが作成されます。 EAの初期化で宣言された CStop インスタンスがない場合、この特定のプロセスはスキップされます。 一方、COrderStop のインスタンスが作成された場合、インスタンスへのポインタは、先ほど作成したCOrderインスタンスの下に格納されます。 COrderの Init メソッド内でこの操作を行います:
bool COrderBase::Init(COrders *orders,CStops *stops) { if(CheckPointer(orders)) SetContainer(GetPointer(orders)); if(CheckPointer(stops)) CreateStops(GetPointer(stops)); m_order_stops.SetContainer(GetPointer(this)); return true; }
COrderのインスタンスのストップを作成するには、以下に示す CreateStops メソッドを呼び出していることがわかります。
void COrderBase::CreateStops(CStops *stops) { if(!CheckPointer(stops)) return; if(stops.Total()>0) { for(int i=0;i<stops.Total();i++) { CStop *stop=stops.At(i); if(CheckPointer(stop)==POINTER_INVALID) continue; m_order_stops.NewOrderStop(GetPointer(this),stop); } } }このメソッドは、ストップロス とテイクレベルの各ペアを表す CStop の使用可能なすべてのインスタンスを繰り返し処理します。 各 CStop インスタンスは、特定の順序のすべてのストップのコンテナである COrderStops のインスタンスに渡されます。 次に、クラスオブジェクトの ヒエラルキー を次のように構築します。
COrderの各インスタンスには、COrderStops 型のメンバが1つあります。 この COrderStops インスタンスは、COrderStop のインスタンスへのポインタを含むコンテナ (CArrayObj の拡張) です。 各 COrderStop インスタンスは、特定のトレードのみ (COrderインスタンス) のストップ (CStop) を表します。
CStop
先に説明したように、オーダーマネージャのソースコードを変更することなく、各トレードのストップをどのように処理するかをカスタマイズするという一定の自由度を持たせたいと考えています。 主にクラス CStop によって達成されます。 このクラスの担当には、次のものがあります。
- ストップロス およびテイクレベルの定義
- ストップの計算に必要な計算を実行する
- 主要トレードの ストップロス およびテイクレベルの導入
- ストップがトリガされているかどうかを確認する
- ストップロス およびテイクレベルの実装における MQL4 と MQL5 の違いを調整する
- 時間の経過によるストップの処理メソッドを定義します (例: ブレイクイーブン、トレーリングなど)。
#1 #5 については、この記事で説明しますが、#6 は別の記事で説明します。
Types
この記事では、次の3種類のストップについて説明します。
- ブローカーベースのストップ-トレードリクエストと一緒にブローカーに送信されるストップ
- 保留中のオーダーのストップ-メインのポジション (MetaTrader4、MetaTrader5ヘッジモード) に対して部分的または完全なヘッジとして機能するか、メインのポジション (MetaTrader5網モード) から減算する保留中のオーダーを使用してストップします。
- 仮想ストップ (ステルスストップ)-ブローカーから非表示にし、EAによってローカルで管理されます。
MetaTrader4 では、ブローカーベースのストップは、トレーダーが最も精通している ストップロス とテイクプロフィットです。 主要なトレードと共にブローカーに送られる価格またはストップです。 ヘッジモードのMetaTrader5バージョンは、メタトレーダーと同じメカニックを使用しています。 一方、ネットモードでは、ストップロス とテイクプロフィットが異なるため (シンボルまたはツールのポジション全体に適用)、このタイプの CStop には保留中のオーダーストップが使用されます。
保留中のオーダーストップは、保留中のオーダーを使用して、ブローカーベースのストップを模倣します。 保留中のオーダーが実行されるとすぐに、EA は、トリガされた保留中のオーダーのボリュームを使用してメインのポジションを閉じるためにトレード操作 (OrderCloseBy) を実行します。 MetaTrader4と MetaTrader5、ヘッジモード、バージョンに当てはまります。 MetaTrader5、ネットモードのバージョンでは、メインのポジションの決済は、1つのシンボルごとに任意の時点で維持することができますので、自動的に行われます。
メインストップ
メインストップは、ポジション全体の決済をトリガします。 通常、ブローカーベースのストップです。 いずれかのブローカーベースの ストップロス またはテイクプロフィットがトリガされると、全体のポジションは市場を離れます。 しかし、複数のストップがあり、ブローカーベースのストップがない場合は、EA は、主なストップを決定させます。 この場合、COrderはトレードの主要なストップである CStop のインスタンスを選択しなければならない。 特に資金の管理などのポジションの主なストップに依存する関数や機能に便利です。 メインストップの ストップロス は、全体のポジションの決済につながるので、トレードをエントリーするための最大のリスクを表します。 そして、メインのストップインスタンスで、EA は応じてサイズを計算することができるでしょう。
ストップが主要なストップとして割り当てられるとき、ボリュームは主要なトレードの最初のボリュームと常に等しいことになります。 ブローカーベースの仮想ストップでも動作しますが、保留中のオーダーに基づくストップでは使用できません。 このアプローチにつながる2つの関連する問題があります。
最初の理由は、MetaTrader4では、保留中のオーダーのエントリの価格を変更することができますが、未決のオーダーはまだトリガされていません。 MetaTrader5 では、トレードオペレーションの明確なフットプリントが維持されなければならないため、不可能です。 新しい保留中のオーダーを発行する必要があり、成功した場合は古いものを削除してから、EAは新しい保留中のオーダーを新しいストップとして使用する必要があります。
2番目の問題は、保留中のオーダーがブローカーに送信されている間に、古い保留中のオーダーがトリガされる可能性があることです。 このEAは、保留中のオーダー (ブローカーが持っている) のトリガに制御を持っていないので、想定されているよりも、主なトレードからより多くのボリュームを閉じる問題につながることができます。
この問題を回避するためのよりシンプルなアプローチでは、保留中のオーダーのボリュームを主要トレードの有効期間中に動的に調整するのではなく、トレードの作成時に保留中のオーダーのボリュームを割り当てることになります。 ただし、メインのストップが保留中のオーダーの種類である場合は、他の保留中のオーダーをストップする必要があります。
Volume
メインのストップでは、メインのポジションから差し引くようにサイズを割り当てる必要はなく、トリガされるとすぐに、ポジション全体を閉じる必要があります。 ただし、他の種類のストップでは、通常、主ポジションの部分的な決済のみを目的としているため、ボリュームを考慮する必要があります。 この配分は4つのタイプに分けられます:
- 固定–固定ロット
- 残存率-メイントレードの残存サイズの割合
- 合計パーセント-主要トレードの総サイズ (初期量) の割合
- 残っている-主要なトレードの残りのボリューム。
固定ロットは、ボリューム割り当ての最もシンプルな形式です。 しかし、EAが各ポジションの動的サイズ計算を使用している場合、最適に機能しません。 サイズがEAに固定されている場合にのみ最適です。
残りのパーセントと残りの割合は、メイン・ストップが仮想であるときに最もよく使われます。 残りは、主要トレードの残りのボリュームよりも大きいボリュームに対してクローズ操作を実行したりすることを防ぎます。 残りの割合は、一方で、EAは、最初のボリュームに基づいていないトレードを閉じる必要がありますが、メインのトレードに残って使用されます。
合計の割合は、ブローカーベース、仮想、および保留中のオーダーベースのストップで使用できます。 このメソッドを使用した計算は、初期の主要トレード量に基づいています。
One-Cancels-the-Other (OCO)
CStop は、常に ストップロス またはテイクプロフィットのいずれかを表す値を持つぺアによって表されます。 ただし、いずれかの値にゼロを割り当てることによって、片側のレベル (テイクプロフィットと欠落した ストップロス、またはその逆) が可能です。 デフォルトでは、1つのストップがトリガされると、他方が決済します。 唯一の例外は、CStop インスタンスがメインストップである場合です。
Base Class
基本クラス
class CStopBase : public CObject { protected: //---ストップ順序の変数 bool m_active; bool m_main; string m_name; bool m_oco; double m_stoploss; string m_stoploss_name; ENUM_STOP_TYPE m_stop_type; double m_takeprofit; string m_takeprofit_name; int m_delay; //---ストップ順序トレード変数 ENUM_VOLUME_TYPE m_volume_type; double m_volume; int m_magic; int m_deviation; string m_comment; //--- stop order objects parameters bool m_entry_visible; bool m_stoploss_visible; bool m_takeprofit_visible; color m_entry_color; color m_stoploss_color; color m_takeprofit_color; ENUM_LINE_STYLE m_entry_style; ENUM_LINE_STYLE m_stoploss_style; ENUM_LINE_STYLE m_takeprofit_style; //---オブジェクト CSymbolManager *m_symbol_man; CSymbolInfo *m_symbol; CAccountInfo *m_account; CTradeManager m_trade_man; CExpertTradeX *m_trade; CTrails *m_trails; CEventAggregator *m_event_man; CStops *m_stops; public: CStopBase(void); ~CStopBase(void); virtual int Type(void) const {return CLASS_TYPE_STOP;} //---初期化 virtual bool Init(CSymbolManager*,CAccountInfo*,CEventAggregator*); virtual bool InitAccount(CAccountInfo*); virtual bool InitEvent(CEventAggregator*); virtual bool InitSymbol(CSymbolManager*); virtual bool InitTrade(void); virtual CStops *GetContainer(void); virtual void SetContainer(CStops*); virtual bool Validate(void) const; //---ゲッターとセッター bool Active(void); void Active(const bool); bool Broker(void) const; void Comment(const string); string Comment(void) const; void Delay(int delay); int Delay(void) const; void SetDeviation(const int); int SetDeviation(void) const; void EntryColor(const color clr); void EntryStyle(const ENUM_LINE_STYLE); void EntryVisible(const bool); bool EntryVisible(void) const; void Magic(const int); int Magic(void) const; void Main(const bool); bool Main(void) const; void Name(const string); string Name(void) const; void OCO(const bool oco); bool OCO(void) const; bool Pending(void) const; void StopLoss(const double); double StopLoss(void) const; void StopLossColor(const color); bool StopLossCustom(void); void StopLossName(const string); string StopLossName(void) const; void StopLossVisible(const bool); bool StopLossVisible(void) const; void StopLossStyle(const ENUM_LINE_STYLE); void StopType(const ENUM_STOP_TYPE); ENUM_STOP_TYPE StopType(void) const; string SymbolName(void); void TakeProfit(const double); double TakeProfit(void) const; void TakeProfitColor(const color); bool TakeProfitCustom(void); void TakeProfitName(const string); string TakeProfitName(void) const; void TakeProfitStyle(const ENUM_LINE_STYLE); void TakeProfitVisible(const bool); bool TakeProfitVisible(void) const; bool Virtual(void) const; void Volume(double); double Volume(void) const; void VolumeType(const ENUM_VOLUME_TYPE); ENUM_VOLUME_TYPE VolumeType(void) const; //---ストップ順序の点検 virtual bool CheckStopLoss(COrder*,COrderStop*); virtual bool CheckTakeProfit(COrder*,COrderStop*); virtual bool CheckStopOrder(ENUM_STOP_MODE,COrder*,COrderStop*)=0; virtual bool DeleteStopOrder(const ulong)=0; virtual bool DeleteMarketStop(const ulong)=0; virtual bool OrderModify(const ulong,const double); //---ストップオーダーオブジェクトの作成 virtual CStopLine *CreateEntryObject(const long,const string,const int,const double); virtual CStopLine *CreateStopLossObject(const long,const string,const int,const double); virtual CStopLine *CreateTakeProfitObject(const long,const string,const int,const double); //---ストップオーダー価格計算 virtual bool Refresh(const string); virtual double StopLossCalculate(const string,const ENUM_ORDER_TYPE,const double); virtual double StopLossCustom(const string,const ENUM_ORDER_TYPE,const double); virtual double StopLossPrice(COrder*,COrderStop*); virtual double StopLossTicks(const ENUM_ORDER_TYPE,const double); virtual double TakeProfitCalculate(const string,const ENUM_ORDER_TYPE,const double); virtual double TakeProfitCustom(const string,const ENUM_ORDER_TYPE,const double); virtual double TakeProfitPrice(COrder*,COrderStop*); virtual double TakeProfitTicks(const ENUM_ORDER_TYPE,const double); //---トレーリング virtual bool Add(CTrails*); virtual double CheckTrailing(const string,const ENUM_ORDER_TYPE,const double,const double,const ENUM_TRAIL_TARGET); protected: //---オブジェクトの作成 virtual CStopLine *CreateObject(const long,const string,const int,const double); //---ストップオーダー価格計算 virtual double LotSizeCalculate(COrder*,COrderStop*); //---ストップ順序の記入項目 virtual bool GetClosePrice(const string,const ENUM_ORDER_TYPE,double&); //---ストップ順序の決済 virtual bool CloseStop(COrder*,COrderStop*,const double)=0; //---初期化 virtual void Deinit(void); virtual void DeinitSymbol(void); virtual void DeinitTrade(void); virtual void DeinitTrails(void); };
ピップまたはポイント数に基づいた ストップロス およびテイクプロフィットレベルの場合、少なくとも4つのクラスメソッドを記憶する必要があります。
- メソッド StopType を使用して、ストップの種類 (ブローカーベース、保留中の順序、または仮想)
- VolumeType メソッドを使用して使用されるボリューム計算の種類
- ストップロス メソッドを使用して、ポイントの ストップロス レベル (必要な場合はいつでも)
- テイクプロフィットメソッドを使用して、ポイントのテイクプロフィットレベル (必要な場合)
すべては、クラスのメンバーの単なるセッターなので、メソッドで詳しく説明する必要はありません。 メソッドの残りの部分のほとんどは、内部計算でクラスによってのみ必要です。 保護されたメソッドの中で最も重要なのは、以下のコードを示す StopLossCalculate および TakeProfitCalculate メソッドです。
double CStopBase::StopLossCalculate(const string symbol,const ENUM_ORDER_TYPE type,const double price) { if(!Refresh(symbol)) return 0; if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_BUY_LIMIT) return price-m_stoploss*m_symbol.Point(); else if(type==ORDER_TYPE_SELL || type==ORDER_TYPE_SELL_STOP || type==ORDER_TYPE_SELL_LIMIT) return price+m_stoploss*m_symbol.Point(); return 0; } double CStopBase::TakeProfitCalculate(const string symbol,const ENUM_ORDER_TYPE type,const double price) { if(!Refresh(symbol)) return 0; if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_BUY_LIMIT) return price+m_takeprofit*m_symbol.Point(); else if(type==ORDER_TYPE_SELL || type==ORDER_TYPE_SELL_STOP || type==ORDER_TYPE_SELL_LIMIT) return price-m_takeprofit*m_symbol.Point(); return 0; }
どちらのメソッドでも、主なトレードに関連する3つの引数を取ります。 このメソッドは、最初に Refresh メソッドを使用してシンボルを更新することによって開始され、シンボルマネージャが正しいシンボルを使って修正します。 シンボルが更新されると、初期化時にクラスインスタンスに渡されたポイント値に基づいて、ストップロス またはテイクプロフィットの値が返されます。
CStops
クラス CStops は、CStop のインスタンスのコンテナとして機能します。 このクラスのインスタンスは、メンバの1つとしてオーダーマネージャに動的に追加する必要があります。次のコードは、CStops の基本クラスである CStopsBase を示しています。
class CStopsBase : public CArrayObj { protected: bool m_active; CEventAggregator *m_event_man; CObject *m_container; public: CStopsBase(void); ~CStopsBase(void); virtual int Type(void) const {return CLASS_TYPE_STOPS;} //---初期化 virtual bool Init(CSymbolManager*,CAccountInfo*,CEventAggregator*); virtual CObject *GetContainer(void); virtual void SetContainer(CObject*); virtual bool Validate(void) const; //---セッターとゲッター virtual bool Active(void) const; virtual void Active(const bool); virtual CStop *Main(void); //---回復 virtual bool CreateElement(const int); };
このクラスは、この記事シリーズまでに説明した他のコンテナと非常によく似ています。
COrderStop
COrderStop は、特定のトレードの CStop の実装を表します。 特定のポジションでは、CStop は最大1つの COrderStop を作成できます。 ただし、任意の数の COrderStop インスタンスは、CStop の同じインスタンスを共有できます。 したがって、EAに CStop の3つの異なるインスタンスがある場合、通常、各COrderインスタンスには COrderStop のインスタンス数が同じになることが予想されます。 EAが1000トレードを行った場合、作成された COrderStop インスタンスの数は 1000 * 3 = 3000 になりますが、作成される CStop インスタンスの数は依然として3になります。
COrderStop の基になっている COrderStopBase の定義は、以下のコードに示されています。
class COrderStopBase : public CObject { protected: bool m_active; //---ストップパラメータ double m_volume; CArrayDouble m_stoploss; CArrayDouble m_takeprofit; ulong m_stoploss_ticket; ulong m_takeprofit_ticket; bool m_stoploss_closed; bool m_takeprofit_closed; bool m_closed; ENUM_STOP_TYPE m_stop_type; string m_stop_name; //--- main order object COrder *m_order; //--- stop objects CStop *m_stop; CStopLine *m_objentry; CStopLine *m_objsl; CStopLine *m_objtp; COrderStops *m_order_stops; public: COrderStopBase(void); ~COrderStopBase(void); virtual int Type(void) const {return CLASS_TYPE_ORDERSTOP;} //---初期化 virtual void Init(COrder*,CStop*,COrderStops*); virtual COrderStops *GetContainer(void); virtual void SetContainer(COrderStops*); virtual void Show(bool); //---ゲッターとセッター bool Active(void) const; void Active(bool active); string EntryName(void) const; ulong MainMagic(void) const; ulong MainTicket(void) const; double MainTicketPrice(void) const; ENUM_ORDER_TYPE MainTicketType(void) const; COrder *Order(void); void Order(COrder*); CStop *Stop(void); void Stop(CStop*); bool StopLoss(const double); double StopLoss(void) const; double StopLoss(const int); void StopLossClosed(const bool); bool StopLossClosed(void); double StopLossLast(void) const; string StopLossName(void) const; void StopLossTicket(const ulong); ulong StopLossTicket(void) const; void StopName(const string); string StopName(void) const; bool TakeProfit(const double); double TakeProfit(void) const; double TakeProfit(const int); void TakeProfitClosed(const bool); bool TakeProfitClosed(void); double TakeProfitLast(void) const; string TakeProfitName(void) const; void TakeProfitTicket(const ulong); ulong TakeProfitTicket(void) const; void Volume(const double); double Volume(void) const; //---チェック virtual void Check(double&)=0; virtual bool Close(void); virtual bool CheckTrailing(void); virtual bool DeleteChartObject(const string); virtual bool DeleteEntry(void); virtual bool DeleteStopLines(void); virtual bool DeleteStopLoss(void); virtual bool DeleteTakeProfit(void); virtual bool IsClosed(void); virtual bool Update(void) {return true;} virtual void UpdateVolume(double) {} //---初期化 virtual void Deinit(void); //---回復 virtual bool Save(const int); virtual bool Load(const int); virtual void Recreate(void); protected: virtual bool IsStopLossValid(const double) const; virtual bool IsTakeProfitValid(const double) const; virtual bool Modify(const double,const double); virtual bool ModifyStops(const double,const double); virtual bool ModifyStopLoss(const double) {return true;} virtual bool ModifyTakeProfit(const double){return true;} virtual bool UpdateOrderStop(const double,const double){return true;} virtual bool MoveStopLoss(const double); virtual bool MoveTakeProfit(const double); };
COrderStop は順番に COrderStops (次のセクションで議論される) によって含まれています。 EA の実際の開発では、COrderStop のインスタンスを宣言する必要はありません。 CStop の特定のインスタンスに基づいてCOrderによって自動的に作成されます。
COrderStops
class COrderStopsBase : public CArrayObj { protected: bool m_active; CArrayInt m_types; COrder *m_order; public: COrderStopsBase(void); ~COrderStopsBase(void); virtual int Type(void) const {return CLASS_TYPE_ORDERSTOPS;} void Active(bool); bool Active(void) const; //---初期化 virtual CObject *GetContainer(void); virtual void SetContainer(COrder*); virtual bool NewOrderStop(COrder*,CStop*)=0; //---チェック virtual void Check(double &volume); virtual bool CheckNewTicket(COrderStop*); virtual bool Close(void); virtual void UpdateVolume(const double) {} //---ストップ線の隠蔽と表示 virtual void Show(const bool); //---回復 virtual bool CreateElement(const int); virtual bool Save(const int); virtual bool Load(const int); };
これはちょうど CStop のようにちょうど典型的なコンテナのように見えます。 ただし、このメソッドには、ポインタを格納するオブジェクト (COrderStop) のメソッドをミラーリングするメソッドがあります。
ストップのチャート表現
CStopLine は CStop のクラスメンバであり、その主な役割はチャート上のストップをグラフィカルに表現したものです。 EAには3つのコア関数があります。
- COrderインスタンスの初期化時にストップを表示する
- ストップの1つまたは両方が変更された場合のストップを更新する
- 主要なトレードが相場を去ったと同時にストップラインを取除きます。
この関数はすべて、CStop クラスを通じて実装されます。
CStopLine の基準となる CStopLineBase の定義を以下に示します。
class CStopLineBase : public CChartObjectHLine { protected: bool m_active; CStop *m_stop; public: CStopLineBase(void); ~CStopLineBase(void); virtual int Type(void) const {return CLASS_TYPE_STOPLINE;} virtual void SetContainer(CStop*); virtual CStop *GetContainer(void); bool Active(void) const; void Active(const bool); virtual bool ChartObjectExists(void) const; virtual double GetPrice(const int); virtual bool Move(const double); virtual bool SetStyle(const ENUM_LINE_STYLE); virtual bool SetColor(const color); };
MetaTrader4の古いバージョンでは、ストップロス およびテイクプロフィットレベルはドラッグによって変更できません。 これらのレベルは、オーダーウィンドウまたはEAとスクリプトを使用して変更する必要がありました。 ただし、レベルのグラフィカルな表現を表示する場合は、特に仮想ストップを扱う場合は、有用かもしれません。
オーダーストップチェック
ストップが所定のポジションに正常に作成された後、次のステップは、相場が特定のストップにヒットしたかどうかを確認することです。 ブローカーベースのストップでは、サーバー側で決済操作が行われるため、このプロセスは必要ありません。 ただし、保留中のオーダーに基づいて仮想ストップを行う場合、ほとんどの場合、決済操作を実行するにはEA自体になります。
仮想ストップについては、EAは、相場の動きを監視し、相場が特定のストップにヒットしたかどうかを確認するための責任があります。 次の図は、一般的な操作を示しています。 相場がストップに達するとすぐに、EAは適切な決算処理を実行します。
保留中のオーダーに基づくストップの場合、プロセスは若干複雑になります。 ストップがトリガされると、保留中のオーダーにつながります。 これは、ブローカー側で自動的に行われます。 したがって、特定の保留中のオーダーがまだ保留中であるか、または既に相場に入っているかを検出するのは、EAの責任となります。 保留中のオーダーが既にトリガされている場合は、EAは、直前に実行された保留中のオーダーのボリュームを使用してメインのポジションを閉じます。
いずれの場合も、指定されたオーダーストップがトリガーされるとすぐに、ストップは [決済] としてマークが付けられます。 指定されたストップが複数回実行されないようにするためです。
サンプル
例 #1: 平均足と移動平均を使用した EA で、単一のストップ (メインストップ)
ほとんどのEAでは、1つの ストップロス および1つのテイクプロフィットで十分です。 前の記事の例を拡張します (「クロスプラットフォームEA: タイムフィルタ」を参照)、ストップロス とテイクプロフィットをソースコードに追加します。 これを行うには、まず、コンテナ (CStops) の新しいインスタンスを作成します。 次に、CStop のインスタンスを作成し、そのコンテナへのポインターを追加します。 コンテナへのポインターは、最終的にオーダーマネージャーに追加されます。 このコードは次のとおりです。
int() { //---その他のコード CStops *stops=new CStops(); CStop *main=new CStop("main"); main.StopType(stop_type_main); main.VolumeType(VOLUME_TYPE_PERCENT_TOTAL); main.Main(true); main.StopLoss(stop_loss); main.TakeProfit(take_profit); stops.Add(GetPointer(main)); order_manager.AddStops(GetPointer(stops)); //---その他のコード }
MetaTrader4 のブローカーベースのストップをテストすると、次の表の結果が表示されます。 トレーダーは、通常のトレードのプラットフォーム上でEAによって実行されると予想されます。
# | Time | Type | Order | Size | Price | S / L | T / P | Profit | Balance |
1 | 2017.01.03 10:00 | sell | 1 | 0.30 | 1.04597 | 1.05097 | 1.04097 | ||
2 | 2017.01.03 10:00 | t/p | 1 | 0.30 | 1.04097 | 1.05097 | 1.04097 | 150.00 | 3150.00 |
3 | 2017.01.05 11:00 | sell | 2 | 0.30 | 1.05149 | 1.05649 | 1.04649 | ||
4 | 2017.01.05 17:28 | s/l | 2 | 0.30 | 1.05649 | 1.05649 | 1.04649 | -150.00 | 3000.00 |
保留中のオーダーに基づくストップの場合、ストップは標準の sl/tp と同じように事前に配置されますが、保留中のオーダーの形式です。 保留中のオーダーがトリガされるとすぐに、EAは操作を実行し、トリガされた保留中のオーダーのボリュームによって主要トレードを決済します。 ただし、標準の sl/tp とは異なり、EAはクライアント側で実行します。 トレーディングプラットフォームがライブで、EA がチャート上で実行されていない限り、実行されません。
# | Time | Type | Order | Size | Price | S / L | T / P | Profit | Balance |
1 | 2017.01.03 10:00 | sell | 1 | 0.30 | 1.04597 | 0.00000 | 0.00000 | ||
2 | 2017.01.03 10:00 | buy stop | 2 | 0.30 | 1.05097 | 0.00000 | 0.00000 | ||
3 | 2017.01.03 10:00 | buy limit | 3 | 0.30 | 1.04097 | 0.00000 | 0.00000 | ||
4 | 2017.01.03 10:00 | buy | 3 | 0.30 | 1.04097 | 0.00000 | 0.00000 | ||
5 | 2017.01.03 10:00 | close by | 1 | 0.30 | 1.04097 | 0.00000 | 0.00000 | 150.00 | 3150.00 |
6 | 2017.01.03 10:00 | close by | 3 | 0.00 | 1.04097 | 0.00000 | 0.00000 | 0.00 | 3150.00 |
7 | 2017.01.03 10:00 | delete | 2 | 0.30 | 1.05097 | 0.00000 | 0.00000 | ||
8 | 2017.01.05 11:00 | sell | 4 | 0.30 | 1.05149 | 0.00000 | 0.00000 | ||
9 | 2017.01.05 11:00 | buy stop | 5 | 0.30 | 1.05649 | 0.00000 | 0.00000 | ||
10 | 2017.01.05 11:00 | buy limit | 6 | 0.30 | 1.04649 | 0.00000 | 0.00000 | ||
11 | 2017.01.05 17:28 | buy | 5 | 0.30 | 1.05649 | 0.00000 | 0.00000 | ||
12 | 2017.01.05 17:28 | close by | 4 | 0.30 | 1.05649 | 0.00000 | 0.00000 | -150.00 | 3000.00 |
13 | 2017.01.05 17:28 | close by | 5 | 0.00 | 1.05649 | 0.00000 | 0.00000 | 0.00 | 3000.00 |
14 | 2017.01.05 17:28 | delete | 6 | 0.30 | 1.04649 | 0.00000 | 0.00000 |
仮想ストップは、主要トレードのストップについては何も送信されません。 ブローカーは、EA が決済命令を実行するとすぐに通知されます。 次の表は、仮想ストップを使用した EA の動作を示しています。 ここでは、ストップの目標価格がトリガされるとすぐに、EA は主要トレードをクローズするために、トレードリクエストをサーバに送信します。
# | Time | Type | Order | Size | Price | S / L | T / P | Profit | Balance |
1 | 2017.01.03 10:00 | sell | 1 | 0.30 | 1.04597 | 0.00000 | 0.00000 | ||
2 | 2017.01.03 10:00 | close | 1 | 0.30 | 1.04097 | 0.00000 | 0.00000 | 150.00 | 3150.00 |
3 | 2017.01.05 11:00 | sell | 2 | 0.30 | 1.05149 | 0.00000 | 0.00000 | ||
4 | 2017.01.05 17:28 | close | 2 | 0.30 | 1.05649 | 0.00000 | 0.00000 | -150.00 | 3000.00 |
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 1.05097 | 1.04097 | 2017.01.03 10:00:00 | filled | |||
2017.01.03 11:34:38 | 3 | EURUSD | buy | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | TP 1.04097 | ||||
2017.01.05 11:00:00 | 4 | EURUSD | sell | 0.30/0.30 | 1.05149 | 1.05649 | 1.04649 | 2017.01.05 11:00:00 | filled | |||
2017.01.05 17:28:37 | 5 | EURUSD | buy | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | sl 1.05649 | ||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.30 | 1.04097 | 3 | 0.00 | 0.00 | 150.00 | 3150.00 | TP 1.04097 |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.30 | 1.05149 | 4 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 5 | EURUSD | buy | out | 0.30 | 1.05649 | 5 | 0.00 | 0.00 | -150.00 | 3000.00 | sl 1.05649 |
0.00 | 0.00 | 0.00 | 3000.00 | |||||||||
ヘッジモードでは、保留中のオーダーは、基本的にMetaTrader4と同じメソッドで動作するので、EA はまた、保留中のオーダーがトリガされたときに操作を実行します。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 10:00:00 | 3 | EURUSD | buy stop | 0.30/0.00 | 1.05097 | 2017.01.03 11:34:38 | canceled | |||||
2017.01.03 10:00:00 | 4 | EURUSD | buy limit | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.03 11:34:38 | 5 | EURUSD | close by | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | close #2 by #4 | ||||
2017.01.05 11:00:00 | 6 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 11:00:00 | 7 | EURUSD | buy stop | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | |||||
2017.01.05 11:00:00 | 8 | EURUSD | buy limit | 0.30/0.00 | 1.04649 | 2017.01.05 17:28:37 | canceled | |||||
2017.01.05 17:28:37 | 9 | EURUSD | close by | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | close #6 by #7 | ||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | in | 0.30 | 1.04097 | 4 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 4 | EURUSD | buy | out by | 0.30 | 1.04097 | 5 | 0.00 | 0.00 | 150.00 | 3150.00 | close #2 by #4 |
2017.01.03 11:34:38 | 5 | EURUSD | sell | out by | 0.30 | 1.04597 | 5 | 0.00 | 0.00 | 0.00 | 3150.00 | close #2 by #4 |
2017.01.05 11:00:00 | 6 | EURUSD | sell | in | 0.30 | 1.05149 | 6 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 7 | EURUSD | buy | in | 0.30 | 1.05649 | 7 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 9 | EURUSD | sell | out by | 0.30 | 1.05149 | 9 | 0.00 | 0.00 | 0.00 | 3150.00 | close #6 by #7 |
2017.01.05 17:28:37 | 8 | EURUSD | buy | out by | 0.30 | 1.05649 | 9 | 0.00 | 0.00 | -150.00 | 3000.00 | close #6 by #7 |
0.00 | 0.00 | 0.00 | 3000.00 | |||||||||
仮想ストップを使用して、通常、MetaTrader4で見るメソッドを "閉じる" タグを参照してください。 決済操作は主要なトレードの反対のタイプを使用しますが、取引履歴で見ることができます。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 11:34:38 | 3 | EURUSD | buy | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.05 11:00:00 | 4 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 17:28:37 | 5 | EURUSD | buy | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | |||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.30 | 1.04097 | 3 | 0.00 | 0.00 | 150.00 | 3150.00 | |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.30 | 1.05149 | 4 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 5 | EURUSD | buy | out | 0.30 | 1.05649 | 5 | 0.00 | 0.00 | -150.00 | 3000.00 | |
0.00 | 0.00 | 0.00 | 3000.00 | |||||||||
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 10:00:00 | 3 | EURUSD | buy stop | 0.30/0.00 | 1.05097 | 2017.01.03 11:34:38 | canceled | |||||
2017.01.03 10:00:00 | 4 | EURUSD | buy limit | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.05 11:00:00 | 5 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 11:00:00 | 6 | EURUSD | buy stop | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | |||||
2017.01.05 11:00:00 | 7 | EURUSD | buy limit | 0.30/0.00 | 1.04649 | 2017.01.05 17:28:37 | canceled | |||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.30 | 1.04097 | 4 | 0.00 | 0.00 | 150.00 | 3150.00 | |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.30 | 1.05149 | 5 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 5 | EURUSD | buy | out | 0.30 | 1.05649 | 6 | 0.00 | 0.00 | -150.00 | 3000.00 | |
0.00 | 0.00 | 0.00 | 3000.00 | |||||||||
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 10:00:00 | 3 | EURUSD | buy stop | 0.30/0.00 | 1.05097 | 2017.01.03 11:34:38 | canceled | |||||
2017.01.03 10:00:00 | 4 | EURUSD | buy limit | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.05 11:00:00 | 5 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 11:00:00 | 6 | EURUSD | buy stop | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | |||||
2017.01.05 11:00:00 | 7 | EURUSD | buy limit | 0.30/0.00 | 1.04649 | 2017.01.05 17:28:37 | canceled | |||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.30 | 1.04097 | 4 | 0.00 | 0.00 | 150.00 | 3150.00 | |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.30 | 1.05149 | 5 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 5 | EURUSD | buy | out | 0.30 | 1.05649 | 6 | 0.00 | 0.00 | -150.00 | 3000.00 | |
0.00 | 0.00 | 0.00 | 3000.00 | |||||||||
次の表は、MetaTrader5、ネットモードでの仮想ストップの使用メソッドを示しています。 ネットモードの仮想ストップは、ヘッジモードと同じように見えるかもしれませんが、内部の仕組みは異なります。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 11:34:38 | 3 | EURUSD | buy | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.05 11:00:00 | 4 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 17:28:37 | 5 | EURUSD | buy | 0.30/0.30 | 1.05649 | 2017.01.05 17:28:37 | filled | |||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.30 | 1.04097 | 3 | 0.00 | 0.00 | 150.00 | 3150.00 | |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.30 | 1.05149 | 4 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 17:28:37 | 5 | EURUSD | buy | out | 0.30 | 1.05649 | 5 | 0.00 | 0.00 | -150.00 | 3000.00 | |
0.00 | 0.00 | 0.00 | 3000.00 | |||||||||
例 #2: Heiken を使用した EA と、3つのストップを持つ移動平均
複雑なEAは、多くの場合、複数の ストップロス とテイクプロフィットを必要とします。 追加のストップ、すなわち "stop1" と "stop2" という名前のストップを追加する前の例と同じメソッドを使用します。
int() { //---その他のコード CStops *stops=new CStops(); CStop *main=new CStop("main"); main.StopType(stop_type_main); main.VolumeType(VOLUME_TYPE_PERCENT_TOTAL); main.Main(true); main.StopLoss(stop_loss); main.TakeProfit(take_profit); stops.Add(GetPointer(main)); CStop *stop1=new CStop("stop1"); stop1.StopType(stop_type1); stop1.VolumeType(VOLUME_TYPE_PERCENT_TOTAL); stop1.Volume(0.35); stop1.StopLoss(stop_loss1); stop1.TakeProfit(take_profit1); stops.Add(GetPointer(stop1)); CStop *stop2=new CStop("stop2"); stop2.StopType(stop_type2); stop2.VolumeType(VOLUME_TYPE_PERCENT_TOTAL); stop2.Volume(0.35); stop2.StopLoss(stop_loss2); stop2.TakeProfit(take_profit2); stops.Add(GetPointer(stop2)); order_manager.AddStops(GetPointer(stops)); //---その他のコード }
次の表は、MetaTrader4のテストの結果を示しています。
# | Time | Type | Order | Size | Price | S / L | T / P | Profit | Balance |
1 | 2017.01.03 10:00 | sell | 1 | 0.30 | 1.04597 | 1.05097 | 1.04097 | ||
2 | 2017.01.03 10:00 | buy stop | 2 | 0.11 | 1.04847 | 0.00000 | 0.00000 | ||
3 | 2017.01.03 10:00 | buy limit | 3 | 0.11 | 1.04347 | 0.00000 | 0.00000 | ||
4 | 2017.01.03 10:21 | buy | 3 | 0.11 | 1.04347 | 0.00000 | 0.00000 | ||
5 | 2017.01.03 10:21 | close by | 1 | 0.11 | 1.04347 | 1.05097 | 1.04097 | 27.50 | 3027.50 |
6 | 2017.01.03 10:21 | sell | 4 | 0.19 | 1.04597 | 1.05097 | 1.04097 | ||
7 | 2017.01.03 10:21 | close by | 3 | 0.00 | 1.04347 | 0.00000 | 0.00000 | 0.00 | 3027.50 |
8 | 2017.01.03 10:21 | delete | 2 | 0.11 | 1.04847 | 0.00000 | 0.00000 | ||
9 | 2017.01.03 10:34 | close | 4 | 0.11 | 1.04247 | 1.05097 | 1.04097 | 38.50 | 3066.00 |
10 | 2017.01.03 10:34 | sell | 5 | 0.08 | 1.04597 | 1.05097 | 1.04097 | ||
11 | 2017.01.03 10:00 | t/p | 5 | 0.08 | 1.04097 | 1.05097 | 1.04097 | 40.00 | 3106.00 |
12 | 2017.01.05 11:00 | sell | 6 | 0.30 | 1.05149 | 1.05649 | 1.04649 | ||
13 | 2017.01.05 11:00 | buy stop | 7 | 0.11 | 1.05399 | 0.00000 | 0.00000 | ||
14 | 2017.01.05 11:00 | buy limit | 8 | 0.11 | 1.04899 | 0.00000 | 0.00000 | ||
15 | 2017.01.05 12:58 | buy | 8 | 0.11 | 1.04899 | 0.00000 | 0.00000 | ||
16 | 2017.01.05 12:58 | close by | 6 | 0.11 | 1.04899 | 1.05649 | 1.04649 | 27.50 | 3133.50 |
17 | 2017.01.05 12:58 | sell | 9 | 0.19 | 1.05149 | 1.05649 | 1.04649 | ||
18 | 2017.01.05 12:58 | close by | 8 | 0.00 | 1.04899 | 0.00000 | 0.00000 | 0.00 | 3133.50 |
19 | 2017.01.05 12:58 | delete | 7 | 0.11 | 1.05399 | 0.00000 | 0.00000 | ||
20 | 2017.01.05 16:00 | close | 9 | 0.19 | 1.05314 | 1.05649 | 1.04649 | -31.35 | 3102.15 |
21 | 2017.01.05 16:00 | buy | 10 | 0.30 | 1.05314 | 1.04814 | 1.05814 | ||
22 | 2017.01.05 16:00 | sell stop | 11 | 0.11 | 1.05064 | 0.00000 | 0.00000 | ||
23 | 2017.01.05 16:00 | sell limit | 12 | 0.11 | 1.05564 | 0.00000 | 0.00000 | ||
24 | 2017.01.05 17:09 | sell | 12 | 0.11 | 1.05564 | 0.00000 | 0.00000 | ||
25 | 2017.01.05 17:09 | close by | 10 | 0.11 | 1.05564 | 1.04814 | 1.05814 | 27.50 | 3129.65 |
26 | 2017.01.05 17:09 | buy | 13 | 0.19 | 1.05314 | 1.04814 | 1.05814 | ||
27 | 2017.01.05 17:09 | close by | 12 | 0.00 | 1.05564 | 0.00000 | 0.00000 | 0.00 | 3129.65 |
28 | 2017.01.05 17:09 | delete | 11 | 0.11 | 1.05064 | 0.00000 | 0.00000 | ||
29 | 2017.01.05 17:28 | close | 13 | 0.11 | 1.05664 | 1.04814 | 1.05814 | 38.50 | 3168.15 |
30 | 2017.01.05 17:28 | buy | 14 | 0.08 | 1.05314 | 1.04814 | 1.05814 | ||
31 | 2017.01.05 17:40 | t/p | 14 | 0.08 | 1.05814 | 1.04814 | 1.05814 | 40.00 | 3208.15 |
上記の表に示すように、すべての3つのストップは、最初のトレードにトリガされました。 仮想ストップでは、EA は主要トレードの部分的なクローズを予想通りに行いました。 保留中のオーダーを使用するストップでは、保留中のオーダーが実行されるとすぐに、EA は操作によって close を実行し、そのボリュームを主要なトレードから差し引かれます。 最後に、主要なストップは、ブローカーベースのストップは、主なトレードは0.08 ロットの残りのボリュームで決済しています。
次の表は、MetaTrader5、ヘッジモードでのテストの結果を示しています。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 1.05097 | 1.04097 | 2017.01.03 10:00:00 | filled | |||
2017.01.03 10:00:00 | 3 | EURUSD | buy stop | 0.11/0.00 | 1.04847 | 2017.01.03 10:21:32 | canceled | |||||
2017.01.03 10:00:00 | 4 | EURUSD | buy limit | 0.11/0.11 | 1.04347 | 2017.01.03 10:21:32 | filled | |||||
2017.01.03 10:21:32 | 5 | EURUSD | close by | 0.11/0.11 | 1.04347 | 2017.01.03 10:21:32 | filled | close #2 by #4 | ||||
2017.01.03 10:33:40 | 6 | EURUSD | buy | 0.11/0.11 | 1.04247 | 2017.01.03 10:33:40 | filled | |||||
2017.01.03 11:34:38 | 7 | EURUSD | buy | 0.08/0.08 | 1.04097 | 2017.01.03 11:34:38 | filled | TP 1.04097 | ||||
2017.01.05 11:00:00 | 8 | EURUSD | sell | 0.30/0.30 | 1.05149 | 1.05649 | 1.04649 | 2017.01.05 11:00:00 | filled | |||
2017.01.05 11:00:00 | 9 | EURUSD | buy stop | 0.11/0.00 | 1.05399 | 2017.01.05 12:58:27 | canceled | |||||
2017.01.05 11:00:00 | 10 | EURUSD | buy limit | 0.11/0.11 | 1.04899 | 2017.01.05 12:58:27 | filled | |||||
2017.01.05 12:58:27 | 11 | EURUSD | close by | 0.11/0.11 | 1.04896 | 2017.01.05 12:58:27 | filled | close #8 by #10 | ||||
2017.01.05 16:00:00 | 12 | EURUSD | buy | 0.19/0.19 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 13 | EURUSD | buy | 0.30/0.30 | 1.05307 | 1.04807 | 1.05807 | 2017.01.05 16:00:00 | filled | |||
2017.01.05 16:00:00 | 14 | EURUSD | sell stop | 0.11/0.00 | 1.05057 | 2017.01.05 17:09:40 | canceled | |||||
2017.01.05 16:00:00 | 15 | EURUSD | sell limit | 0.11/0.11 | 1.05557 | 2017.01.05 17:09:40 | filled | |||||
2017.01.05 17:09:40 | 16 | EURUSD | close by | 0.11/0.11 | 1.05557 | 2017.01.05 17:09:40 | filled | close #13 by #15 | ||||
2017.01.05 17:28:47 | 17 | EURUSD | sell | 0.11/0.11 | 1.05660 | 2017.01.05 17:28:47 | filled | |||||
2017.01.05 17:29:15 | 18 | EURUSD | sell | 0.08/0.08 | 1.05807 | 2017.01.05 17:29:15 | filled | TP 1.05807 | ||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 10:21:32 | 3 | EURUSD | buy | in | 0.11 | 1.04347 | 4 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 10:21:32 | 4 | EURUSD | buy | out by | 0.11 | 1.04347 | 5 | 0.00 | 0.00 | 27.50 | 3027.50 | close #2 by #4 |
2017.01.03 10:21:32 | 5 | EURUSD | sell | out by | 0.11 | 1.04597 | 5 | 0.00 | 0.00 | 0.00 | 3027.50 | close #2 by #4 |
2017.01.03 10:33:40 | 6 | EURUSD | buy | out | 0.11 | 1.04247 | 6 | 0.00 | 0.00 | 38.50 | 3066.00 | |
2017.01.03 11:34:38 | 7 | EURUSD | buy | out | 0.08 | 1.04097 | 7 | 0.00 | 0.00 | 40.00 | 3106.00 | TP 1.04097 |
2017.01.05 11:00:00 | 8 | EURUSD | sell | in | 0.30 | 1.05149 | 8 | 0.00 | 0.00 | 0.00 | 3106.00 | |
2017.01.05 12:58:27 | 9 | EURUSD | buy | in | 0.11 | 1.04896 | 10 | 0.00 | 0.00 | 0.00 | 3106.00 | |
2017.01.05 12:58:27 | 10 | EURUSD | buy | out by | 0.11 | 1.04896 | 11 | 0.00 | 0.00 | 27.83 | 3133.83 | close #8 by #10 |
2017.01.05 12:58:27 | 11 | EURUSD | sell | out by | 0.11 | 1.05149 | 11 | 0.00 | 0.00 | 0.00 | 3133.83 | close #8 by #10 |
2017.01.05 16:00:00 | 12 | EURUSD | buy | out | 0.19 | 1.05307 | 12 | 0.00 | 0.00 | -30.02 | 3103.81 | |
2017.01.05 16:00:00 | 13 | EURUSD | buy | in | 0.30 | 1.05307 | 13 | 0.00 | 0.00 | 0.00 | 3103.81 | |
2017.01.05 17:09:40 | 14 | EURUSD | sell | in | 0.11 | 1.05557 | 15 | 0.00 | 0.00 | 0.00 | 3103.81 | |
2017.01.05 17:09:40 | 16 | EURUSD | buy | out by | 0.11 | 1.05307 | 16 | 0.00 | 0.00 | 0.00 | 3103.81 | close #13 by #15 |
2017.01.05 17:09:40 | 15 | EURUSD | sell | out by | 0.11 | 1.05557 | 16 | 0.00 | 0.00 | 27.50 | 3131.31 | close #13 by #15 |
2017.01.05 17:28:47 | 17 | EURUSD | sell | out | 0.11 | 1.05660 | 17 | 0.00 | 0.00 | 38.83 | 3170.14 | |
2017.01.05 17:29:15 | 18 | EURUSD | sell | out | 0.08 | 1.05807 | 18 | 0.00 | 0.00 | 40.00 | 3 210.14 | TP 1.05807 |
0.00 | 0.00 | 210.14 | 3 210.14 | |||||||||
上記の表に示されているように、EA は MetaTrader5、ヘッジモードでやや似たようなメソッドで動作します。 このメカニックは、ストップの3種類のMetaTrader4と同じでした。
次の表は、MetaTrader5、ネットモードでのテストの結果を示しています。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 10:00:00 | 3 | EURUSD | buy stop | 0.30/0.00 | 1.05097 | 2017.01.03 11:34:38 | canceled | |||||
2017.01.03 10:00:00 | 4 | EURUSD | buy limit | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.03 10:00:00 | 5 | EURUSD | buy stop | 0.11/0.00 | 1.04847 | 2017.01.03 10:21:32 | canceled | |||||
2017.01.03 10:00:00 | 6 | EURUSD | buy limit | 0.11/0.11 | 1.04347 | 2017.01.03 10:21:32 | filled | |||||
2017.01.03 10:33:40 | 7 | EURUSD | buy | 0.11/0.11 | 1.04247 | 2017.01.03 10:33:40 | filled | |||||
2017.01.05 11:00:00 | 8 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 11:00:00 | 9 | EURUSD | buy stop | 0.30/0.00 | 1.05649 | 2017.01.05 16:00:00 | canceled | |||||
2017.01.05 11:00:00 | 10 | EURUSD | buy limit | 0.30/0.00 | 1.04649 | 2017.01.05 16:00:00 | canceled | |||||
2017.01.05 11:00:00 | 11 | EURUSD | buy stop | 0.11/0.00 | 1.05399 | 2017.01.05 12:58:27 | canceled | |||||
2017.01.05 11:00:00 | 12 | EURUSD | buy limit | 0.11/0.11 | 1.04899 | 2017.01.05 12:58:27 | filled | |||||
2017.01.05 16:00:00 | 13 | EURUSD | buy | 0.19/0.19 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 14 | EURUSD | buy | 0.30/0.30 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 15 | EURUSD | sell stop | 0.30/0.00 | 1.04807 | 2017.01.05 17:29:15 | canceled | |||||
2017.01.05 16:00:00 | 16 | EURUSD | sell limit | 0.30/0.30 | 1.05807 | 2017.01.05 17:29:15 | filled | |||||
2017.01.05 16:00:00 | 17 | EURUSD | sell stop | 0.11/0.00 | 1.05057 | 2017.01.05 17:09:40 | canceled | |||||
2017.01.05 16:00:00 | 18 | EURUSD | sell limit | 0.11/0.11 | 1.05557 | 2017.01.05 17:09:40 | filled | |||||
2017.01.05 17:28:47 | 19 | EURUSD | sell | 0.11/0.11 | 1.05660 | 2017.01.05 17:28:47 | filled | |||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 5 | EURUSD | buy | in/out | 0.30 | 1.04097 | 4 | 0.00 | 0.00 | 40.00 | 3040.00 | |
2017.01.03 10:21:32 | 3 | EURUSD | buy | out | 0.11 | 1.04347 | 6 | 0.00 | 0.00 | 27.50 | 3067.50 | |
2017.01.03 10:33:40 | 4 | EURUSD | buy | out | 0.11 | 1.04247 | 7 | 0.00 | 0.00 | 38.50 | 3106.00 | |
2017.01.05 11:00:00 | 6 | EURUSD | sell | in/out | 0.30 | 1.05149 | 8 | 0.00 | -0.61 | 231.44 | 3336.83 | |
2017.01.05 12:58:27 | 7 | EURUSD | buy | in/out | 0.11 | 1.04896 | 12 | 0.00 | 0.00 | 20.24 | 3357.07 | |
2017.01.05 16:00:00 | 8 | EURUSD | buy | in | 0.19 | 1.05307 | 13 | 0.00 | 0.00 | 0.00 | 3357.07 | |
2017.01.05 16:00:00 | 9 | EURUSD | buy | in | 0.30 | 1.05307 | 14 | 0.00 | 0.00 | 0.00 | 3357.07 | |
2017.01.05 17:29:15 | 12 | EURUSD | sell | out | 0.30 | 1.05807 | 16 | 0.00 | 0.00 | 157.11 | 3514.18 | |
2017.01.05 17:09:40 | 10 | EURUSD | sell | out | 0.11 | 1.05557 | 18 | 0.00 | 0.00 | 30.11 | 3544.29 | |
2017.01.05 17:28:47 | 11 | EURUSD | sell | out | 0.11 | 1.05660 | 19 | 0.00 | 0.00 | 41.44 | 3585.73 | |
0.00 | -0.61 | 586.34 | 3585.73 | |||||||||
ここでは、問題が発生しました。 最後のストップは、前の2つのテストで観測された0.08 ロットではなく0.30 ロットで決済しました。
前に説明したように、MetaTrader5の標準 ストップロス とテイクプロフィットは、ネットモードでは、前の2つのものとは異なります。 したがって、EA はブローカーベースのストップを、代わりに保留中のオーダーベースのストップに変換します。 ただし、この設定では、EA はすでに保留中のオーダーに基づいて2つのストップを持っており、そのうちの1つがメインストップです。 また、前述のように、孤立したトレードにつながる。 最終または主要なストップは、常に主要なトレードの最初のボリュームに等しいボリュームを持つことになります。 また、他のストップが関与していたので、メインのストップには、残りのボリューム以上のメインのポジションを閉じるにつながることができます。
この問題を解決するために、1つのメソッドは、メインのストップを仮想ではなく、ブローカーベースまたは保留中の順序に基づいて設定することです。 この新しい設定では、EA は現在、仮想であり、保留中のオーダーに基づいている1つのストップを2ストップしています。 この新しい設定を使用したテストの結果を以下に示します。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 2017.01.03 10:00:00 | filled | |||||
2017.01.03 10:00:00 | 3 | EURUSD | buy stop | 0.11/0.00 | 1.04847 | 2017.01.03 10:21:32 | canceled | |||||
2017.01.03 10:00:00 | 4 | EURUSD | buy limit | 0.11/0.11 | 1.04347 | 2017.01.03 10:21:32 | filled | |||||
2017.01.03 10:33:40 | 5 | EURUSD | buy | 0.11/0.11 | 1.04247 | 2017.01.03 10:33:40 | filled | |||||
2017.01.03 11:34:38 | 6 | EURUSD | buy | 0.08/0.08 | 1.04097 | 2017.01.03 11:34:38 | filled | |||||
2017.01.05 11:00:00 | 7 | EURUSD | sell | 0.30/0.30 | 1.05149 | 2017.01.05 11:00:00 | filled | |||||
2017.01.05 11:00:00 | 8 | EURUSD | buy stop | 0.11/0.00 | 1.05399 | 2017.01.05 12:58:27 | canceled | |||||
2017.01.05 11:00:00 | 9 | EURUSD | buy limit | 0.11/0.11 | 1.04899 | 2017.01.05 12:58:27 | filled | |||||
2017.01.05 16:00:00 | 10 | EURUSD | buy | 0.19/0.19 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 11 | EURUSD | buy | 0.30/0.30 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 12 | EURUSD | sell stop | 0.11/0.00 | 1.05057 | 2017.01.05 17:09:40 | canceled | |||||
2017.01.05 16:00:00 | 13 | EURUSD | sell limit | 0.11/0.11 | 1.05557 | 2017.01.05 17:09:40 | filled | |||||
2017.01.05 17:28:47 | 14 | EURUSD | sell | 0.11/0.11 | 1.05660 | 2017.01.05 17:28:47 | filled | |||||
2017.01.05 17:29:15 | 15 | EURUSD | sell | 0.08/0.08 | 1.05807 | 2017.01.05 17:29:15 | filled | |||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 10:21:32 | 3 | EURUSD | buy | out | 0.11 | 1.04347 | 4 | 0.00 | 0.00 | 27.50 | 3027.50 | |
2017.01.03 10:33:40 | 4 | EURUSD | buy | out | 0.11 | 1.04247 | 5 | 0.00 | 0.00 | 38.50 | 3066.00 | |
2017.01.03 11:34:38 | 5 | EURUSD | buy | out | 0.08 | 1.04097 | 6 | 0.00 | 0.00 | 40.00 | 3106.00 | |
2017.01.05 11:00:00 | 6 | EURUSD | sell | in | 0.30 | 1.05149 | 7 | 0.00 | 0.00 | 0.00 | 3106.00 | |
2017.01.05 12:58:27 | 7 | EURUSD | buy | out | 0.11 | 1.04896 | 9 | 0.00 | 0.00 | 27.83 | 3133.83 | |
2017.01.05 16:00:00 | 8 | EURUSD | buy | out | 0.19 | 1.05307 | 10 | 0.00 | 0.00 | -30.02 | 3103.81 | |
2017.01.05 16:00:00 | 9 | EURUSD | buy | in | 0.30 | 1.05307 | 11 | 0.00 | 0.00 | 0.00 | 3103.81 | |
2017.01.05 17:09:40 | 10 | EURUSD | sell | out | 0.11 | 1.05557 | 13 | 0.00 | 0.00 | 27.50 | 3131.31 | |
2017.01.05 17:28:47 | 11 | EURUSD | sell | out | 0.11 | 1.05660 | 14 | 0.00 | 0.00 | 38.83 | 3170.14 | |
2017.01.05 17:29:15 | 12 | EURUSD | sell | out | 0.08 | 1.05807 | 15 | 0.00 | 0.00 | 40.00 | 3 210.14 | |
0.00 | 0.00 | 210.14 | 3 210.14 | |||||||||
ストップによって取られる総ボリュームは主要なトレードの最初のボリュームと同じです。
例 #3: 資金管理とストップ
以前の記事 (「クロスプラットフォームEA: マネーマネジメント」を参照) では、一部の資金管理メソッドが一定のストップに依存していることが議論されました (テイクプロフィットは可能ですが、ストップロス は通常使用されます)。 固定小数、固定リスク、ポイント/pip あたりの固定リスクなどの資金管理メソッドは、しばしば有限の ストップロス レベルを必要とします。 このレベルを設定しないと、非常に大きい、あるいは無限のリスクが示唆され、したがって、計算されたボリュームも非常に大きくなります。 この記事に記載されているクラスオブジェクトを 資金管理できるEAを表示するために、最初の例を変更して、以前にコメントしたコード行がコンパイルに含まれるようにします。
まず、以下のコードに示されているように、資金管理メソッドのコード行にコメントタグを削除します。:
int() { //---その他のコード order_manager=new COrderManager(); money_manager= new CMoneys(); CMoney *money_fixed=new CMoneyFixedLot(0.05); CMoney *money_ff=new CMoneyFixedFractional(5); CMoney *money_ratio=new CMoneyFixedRatio(0,0.1,1000); CMoney *money_riskperpoint=new CMoneyFixedRiskPerPoint(0.1); CMoney *money_risk=new CMoneyFixedRisk(100); money_manager.Add(money_fixed); money_manager.Add(money_ff); money_manager.Add(money_ratio); money_manager.Add(money_riskperpoint); money_manager.Add(money_risk); order_manager.AddMoneys(money_manager); //---その他のコード }
次に、ソースコードの先頭で、カスタム列挙体を宣言して、使用する 資金管理メソッドをソースコードで提示された順序で選択できるようにする外部パラメータを作成します。
enum ENUM_MM_TYPE { MM_FIXED=0, MM_FIXED_FRACTIONAL, MM_FIXED_RATIO, MM_FIXED_RISK_PER_POINT, MM_FIXED_RISK };
次に、この列挙体の新しいインプットパラメータを宣言します。
input ENUM_MM_TYPE mm_type=MM_FIXED_FRACTIONAL;
最後に、OnTick 関数内の資金の管理メソッドの実際の選択にこのパラメータをリンクする必要があります:
void OnTick() { //--- manage_trades(); if(symbol_info.RefreshRates()) { signals.Check(); if(signals.CheckOpenLong()) { close_last(); if(time_filters.Evaluate(TimeCurrent())) { Print("Entering buy trade.."); money_manager.Selected((int)mm_type); //use mm_type, cast to 'int' type order_manager.TradeOpen(Symbol(),ORDER_TYPE_BUY,symbol_info.Ask()); } } else if(signals.CheckOpenShort()) { close_last(); if(time_filters.Evaluate(TimeCurrent())) { Print("Entering sell trade.."); money_manager.Selected((int)mm_type); //use mm_type, cast to 'int' type order_manager.TradeOpen(Symbol(),ORDER_TYPE_SELL,symbol_info.Bid()); } } } }
資金管理メソッドは純粋な計算だけで対処するので、MQL4 と MQL5 の間の互換性に関する問題はありません。 前の2つの例では、2つのプラットフォームでストップがどのように動作するかを既に示しています。 次の表は、MetaTrader5 のヘッジモードに関するテストの結果を示しています。
固定小数金管理を使用したテスト結果を示しています。 コード化された設定は、アカウントの 5% のリスクです。 $3000 の開始のバランスによって、最初のトレードの ストップロス に当るかどうか $150 あたりをを期待します。 ストップロス とテイクプロフィットは同じ値 (500 ポイント) なので、テイクプロフィットになる場合、同様に $150 を期待しています。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.30/0.30 | 1.04597 | 1.05097 | 1.04097 | 2017.01.03 10:00:00 | filled | |||
2017.01.03 11:34:38 | 3 | EURUSD | buy | 0.30/0.30 | 1.04097 | 2017.01.03 11:34:38 | filled | TP 1.04097 | ||||
2017.01.05 11:00:00 | 4 | EURUSD | sell | 0.32 / 0.32 | 1.05149 | 1.05649 | 1.04649 | 2017.01.05 11:00:00 | filled | |||
2017.01.05 16:00:00 | 5 | EURUSD | buy | 0.32 / 0.32 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 6 | EURUSD | buy | 0.31 / 0.31 | 1.05307 | 1.04807 | 1.05807 | 2017.01.05 16:00:00 | filled | |||
2017.01.05 17:29:15 | 7 | EURUSD | sell | 0.31 / 0.31 | 1.05807 | 2017.01.05 17:29:15 | filled | TP 1.05807 | ||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.30 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.30 | 1.04097 | 3 | 0.00 | 0.00 | 150.00 | 3150.00 | TP 1.04097 |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.32 | 1.05149 | 4 | 0.00 | 0.00 | 0.00 | 3150.00 | |
2017.01.05 16:00:00 | 5 | EURUSD | buy | out | 0.32 | 1.05307 | 5 | 0.00 | 0.00 | -50.56 | 3 099.44 | |
2017.01.05 16:00:00 | 6 | EURUSD | buy | in | 0.31 | 1.05307 | 6 | 0.00 | 0.00 | 0.00 | 3 099.44 | |
2017.01.05 17:29:15 | 7 | EURUSD | sell | out | 0.31 | 1.05807 | 7 | 0.00 | 0.00 | 155.00 | 3 254.44 | TP 1.05807 |
0.00 | 0.00 | 254.44 | 3 254.44 | |||||||||
計算されたボリューム値は、最小ロットおよび最小ロットステップパラメータによって決まるブローカーのロット精度にも依存することに注意してください。 EAに常に正確な計算を行うことを期待することはできません これらの制約により、EAは、ある時点で値を四捨五入する必要があります。 同じことは、金銭管理の他のメソッドについても同様です。
資金管理ごとの固定リスクの場合、コード化された設定は、ストップロス のポイントごとに $0.1 のリスクになります。 両方の ストップロス とテイクプロフィットの500ポイントの設定では、利益/損失 $50 のいずれかを期待しています。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.10 / 0.10 | 1.04597 | 1.05097 | 1.04097 | 2017.01.03 10:00:00 | filled | |||
2017.01.03 11:34:38 | 3 | EURUSD | buy | 0.10 / 0.10 | 1.04097 | 2017.01.03 11:34:38 | filled | TP 1.04097 | ||||
2017.01.05 11:00:00 | 4 | EURUSD | sell | 0.10 / 0.10 | 1.05149 | 1.05649 | 1.04649 | 2017.01.05 11:00:00 | filled | |||
2017.01.05 16:00:00 | 5 | EURUSD | buy | 0.10 / 0.10 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 6 | EURUSD | buy | 0.10 / 0.10 | 1.05307 | 1.04807 | 1.05807 | 2017.01.05 16:00:00 | filled | |||
2017.01.05 17:29:15 | 7 | EURUSD | sell | 0.10 / 0.10 | 1.05807 | 2017.01.05 17:29:15 | filled | TP 1.05807 | ||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.10 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.10 | 1.04097 | 3 | 0.00 | 0.00 | 50.00 | 3 050.00 | TP 1.04097 |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.10 | 1.05149 | 4 | 0.00 | 0.00 | 0.00 | 3 050.00 | |
2017.01.05 16:00:00 | 5 | EURUSD | buy | out | 0.10 | 1.05307 | 5 | 0.00 | 0.00 | -15.80 | 3 034.20 | |
2017.01.05 16:00:00 | 6 | EURUSD | buy | in | 0.10 | 1.05307 | 6 | 0.00 | 0.00 | 0.00 | 3 034.20 | |
2017.01.05 17:29:15 | 7 | EURUSD | sell | out | 0.10 | 1.05807 | 7 | 0.00 | 0.00 | 50.00 | 3 084.20 | TP 1.05807 |
0.00 | 0.00 | 84.20 | 3 084.20 | |||||||||
固定リスク資金管理の場合、コード化された設定は $100 のリスクになります。 このEA は、このセットのリスクに適合するボリュームを計算する必要があります。 結果は以下の通りです。
Orders |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Open Time | Order | Symbol | Type | Volume | Price | S / L | T / P | Time | State | Comment | ||
2017.01.03 10:00:00 | 2 | EURUSD | sell | 0.20 / 0.20 | 1.04597 | 1.05097 | 1.04097 | 2017.01.03 10:00:00 | filled | |||
2017.01.03 11:34:38 | 3 | EURUSD | buy | 0.20 / 0.20 | 1.04097 | 2017.01.03 11:34:38 | filled | TP 1.04097 | ||||
2017.01.05 11:00:00 | 4 | EURUSD | sell | 0.20 / 0.20 | 1.05149 | 1.05649 | 1.04649 | 2017.01.05 11:00:00 | filled | |||
2017.01.05 16:00:00 | 5 | EURUSD | buy | 0.20 / 0.20 | 1.05307 | 2017.01.05 16:00:00 | filled | |||||
2017.01.05 16:00:00 | 6 | EURUSD | buy | 0.20 / 0.20 | 1.05307 | 1.04807 | 1.05807 | 2017.01.05 16:00:00 | filled | |||
2017.01.05 17:29:15 | 7 | EURUSD | sell | 0.20 / 0.20 | 1.05807 | 2017.01.05 17:29:15 | filled | TP 1.05807 | ||||
Deals |
||||||||||||
Time | Deal | Symbol | Type | Direction | Volume | Price | Order | Commission | Swap | Profit | Balance | Comment |
2017.01.01 00:00:00 | 1 | balance | 0.00 | 0.00 | 3000.00 | 3000.00 | ||||||
2017.01.03 10:00:00 | 2 | EURUSD | sell | in | 0.20 | 1.04597 | 2 | 0.00 | 0.00 | 0.00 | 3000.00 | |
2017.01.03 11:34:38 | 3 | EURUSD | buy | out | 0.20 | 1.04097 | 3 | 0.00 | 0.00 | 100.00 | 3 100.00 | TP 1.04097 |
2017.01.05 11:00:00 | 4 | EURUSD | sell | in | 0.20 | 1.05149 | 4 | 0.00 | 0.00 | 0.00 | 3 100.00 | |
2017.01.05 16:00:00 | 5 | EURUSD | buy | out | 0.20 | 1.05307 | 5 | 0.00 | 0.00 | -31.60 | 3 068.40 | |
2017.01.05 16:00:00 | 6 | EURUSD | buy | in | 0.20 | 1.05307 | 6 | 0.00 | 0.00 | 0.00 | 3 068.40 | |
2017.01.05 17:29:15 | 7 | EURUSD | sell | out | 0.20 | 1.05807 | 7 | 0.00 | 0.00 | 100.00 | 3 168.40 | TP 1.05807 |
0.00 | 0.00 | 168.40 | 3 168.40 | |||||||||
結論
この記事では、クロスプラットフォームEAにおけるストップの追加について説明しました。 2つのトレーディングプラットフォームは、多くのパラレル関数を備えていますが、ストップの実装メソッドは大きく異なります。 この記事には、EAが両方のプラットフォームと互換性を持つために、違いを調整できるメソッドが用意されています。
この記事で使用されるプログラム
# |
Name |
Type |
Description |
---|---|---|---|
1. |
stops_ha_ma1.mqh |
Header File |
最初の例のEAに使用されるメインヘッダーファイル |
2. |
stops_ha_ma1.mq4 | Expert Advisor |
最初の例の MQL4 EAに使用されるメインソースファイル |
3. |
stops_ha_ma1.mq5 | Expert Advisor | 最初の例の MQL5 エキスパートアドバイザで使用されるメインソースファイル |
4. | stops_ha_ma2.mqh | Header File | 2番目の例のEAに使用されるメインヘッダーファイル |
5. | stops_ha_ma2.mq4 | Expert Advisor |
2番目の例の MQL4 EAに使用されるメインソースファイル |
6. | stops_ha_ma2.mq5 | Expert Advisor |
2番目の例の MQL5 エキスパートアドバイザで使用されるメインソースファイル |
7. | stops_ha_ma3.mqh | Header File | 3番目の例のEAに使用されるメインヘッダーファイル |
8. | stops_ha_ma3.mq4 | Expert Advisor |
3番目の例の MQL4 EAに使用されるメインソースファイル |
9. | stops_ha_ma3.mq5 | Expert Advisor |
3番目の例の MQL5 エキスパートアドバイザで使用されるメインソースファイル |
この記事で紹介されているクラスファイル
# |
Name |
Type |
Description |
---|---|---|---|
1. |
MQLx\Base\Stop\StopBase.mqh |
Header File |
CStop (base class) |
2. |
MQLx\MQL4\Stop\Stop.mqh | Header File | CStop (MQL4 version) |
3. |
MQLx\MQL5\Stop\Stop.mqh | Header File | CStop (MQL5 version) |
4. | MQLx\Base\Stop\StopsBase.mqh | Header File | CStops (CStop container, base class) |
5. | MQLx\MQL4\Stop\Stops.mqh | Header File | CStops (MQL4 version) |
6. | MQLx\MQL5\Stop\Stops.mqh | Header File | CStops (MQL5 version) |
7. | MQLx\Base\Stop\StopLineBase.mqh | Header File | CStopLine (graphical representation, base class) |
8. | MQLx\MQL4\Stop\StopLine.mqh | Header File | CStopLine (MQL4 version) |
9. | MQLx\MQL5\Stop\StopLine.mqh | Header File | CStopLine (MQL5 version) |
10. | MQLx\Base\Order\OrderStopBase.mqh | Header File | COrderStop (base class) |
11. | MQLx\MQL4\Order\OrderStop.mqh | Header File | COrderStop (MQL4 version) |
12. | MQLx\MQL5\Order\OrderStop.mqh | Header File | COrderStop (MQL5 version) |
13. |
MQLx\Base\Order\OrderStopVirtualBase.mqh | Header File |
COrderStopVirtual (virtual stop level, base class) |
14. | MQLx\Base\Order\OrderStopVirtual.mqh | Header File |
COrderStopVirtual (MQL4 version) |
15. |
MQLx\Base\Order\OrderStopVirtual.mqh | Header File |
COrderStopVirtual (MQL5 version) |
16. | MQLx\Base\Order\OrderStopPendingBase.mqh | Header File |
COrderStopPending (pending order stop level, base class) |
17. | MQLx\Base\Order\OrderStopPending.mqh | Header File |
COrderStopPending (MQL4 version) |
18. |
MQLx\Base\Order\OrderStopPending.mqh | Header File |
COrderStopPending (MQL5 version) |
19. |
MQLx\Base\Order\OrderStopBroker.mqh | Header File |
COrderStopBroker (broker-based stop level, base class) |
20. | MQLx\Base\Order\OrderStopBroker.mqh | Header File |
COrderStopBroker (MQL4 version) |
21. | MQLx\Base\Order\OrderStopBroker.mqh | Header File |
COrderStopBroker (MQL5 version) |
22. | MQLx\Base\Order\OrderStopsBase.mqh | Header File |
COrderStops (COrderStop container, base class) |
23. | MQLx\Base\Order\OrderStops.mqh | Header File |
COrderStops (MQL4 version) |
24. | MQLx\Base\Order\OrderStops.mqh | Header File |
COrderStops (MQL5 version) |
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/3620




- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索