記事"クロスプラットフォームEA: ストップ"についてのディスカッション

 

新しい記事 クロスプラットフォームEA: ストップ はパブリッシュされました:

この記事では、2つのプラットフォームMetaTrader4とMetaTrader5との互換性を確保するために、EAのストップの実装について説明します。

ストップの作成の一般的な操作を次の図に示します。

ストップの作成の一般的な操作

前述の2つのフローチャートに示されているように、トレードが正常にエントリーされるとすぐに、新しいCOrderインスタンスが作成されます。 その後、定義された ストップロス およびテイクレベルに対して COrderStop のインスタンスが作成されます。 EAの初期化で宣言された CStop インスタンスがない場合、この特定のプロセスはスキップされます。

作者: Enrico Lambino

 

SL/TPを特定の値に設定するが、建値からの 距離は設定しない場合、どの方法を使用すればよいですか?

 
それはStopLossCustomとTakeProfitCustomメソッドである。これらのメソッドについては次の記事で説明する。
 

私のEAでいくつかのストップを使用してみました。manage_trades()関数を 追加し、最後のストップがアクティブになった(ポジションがクローズされた)後に表示されたのがこれです:

2017.09.10 09:48:25.706 2017.01.03 17:50:23   failed market buy 0.00 EURUSD [Invalid volume]
2017.09.10 09:48:25.706 2017.01.03 17:50:23   CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]
2017.09.10 09:48:25.706 2017.01.03 17:50:23   position #2  is already closed, closing object..
2017.09.10 09:48:25.706 2017.01.03 17:50:23   failed market buy 0.00 EURUSD [Invalid volume]
2017.09.10 09:48:25.706 2017.01.03 17:50:23   CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]
2017.09.10 09:48:25.707 2017.01.03 17:50:23   position #2  is already closed, closing object..
2017.09.10 09:48:25.707 2017.01.03 17:50:23   failed market buy 0.00 EURUSD [Invalid volume]
2017.09.10 09:48:25.707 2017.01.03 17:50:23   CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]

3つのストップを使っていますが、すべて仮想です。

それはロットに関するものです。私は固定ロット0.1を使っています。最初のクローズ後、残量は0.06。最後のクローズ(ボリュームを指定しないメインストップ)の後、上記のエラーが発生しました。

ロットが高いときは大丈夫です。あなたのEAの例も同じです。

 
mbjen:

私のEAでいくつかのストップを使用してみました。manage_trades()関数を 追加し、最後のストップがアクティブになった(ポジションがクローズされた)後に表示されたのがこれです:

3つのストップを使っていますが、すべて仮想です。

それはロットに関するものです。私は固定ロット0.1を使っています。最初のクローズ後、残量は0.06。最後のクローズ(ボリュームを指定しないメインストップ)の後、上記のエラーが発生しました。

ロットが高いときは大丈夫です。あなたのEAの例も同じです。

ライブラリの最新版(この記事に添付されているもの)を使用していることを確認してください。また、EAのソースコードを添付していただけると助かります。

 
Enrico Lambino:

ライブラリの最新バージョン(この記事に添付されているもの)を使用していることを確認してください。また、EAのソースコードを添付していただけると助かります。


はい、この記事に添付されているファイルをすべて更新しました。しかし、もしかしたら、もう一度更新したのかもしれません。

stops_ha_ma2のサンプルで、MMを固定ロットに変更し、ロットサイズを小さな値に変更して試していただけますか?

 
mbjen:

はい、この記事に添付されているファイルをすべて更新しました。しかし、あなたがもう一度更新したのかどうかはわかりません。

stops_ha_ma2のサンプルで、MMを固定ロットに変更し、ロットサイズを小さな値に変更して試していただけますか?

問題が発生しているEAのソースコードをここに掲載していただけますか?私たちの会話は公開されていますし、あなたが上に投稿したエラーはEAにとって深刻な問題です。あなたのコードをテストする機会を与えることで、他の読者にもこの会話から学んでもらいたいと思います。
 
Enrico Lambino:
問題が発生しているEAのソースコードをここに掲載していただけますか?私たちの会話は公開されており、あなたが上に投稿したエラーはEAにとって深刻な問題です。あなたのコードをテストする機会を与えることで、他の読者にもこの会話から学んでもらいたいと思います。

あなたのEAでも同じエラーが出たので、私のEAとは関係ありません。とにかく、私はそれを別のターミナルのコピーにインストールしました。もうエラーは出ません。多分、私の標準ライブラリか 何か他のものに何か問題があったのでしょう。

ありがとうございました。

 
mbjen:

あなたのEAでも同じエラーが出たので、私のEAとは関係ありません。とにかく、私はそれを別のターミナルコピーにインストールしました。エラーは出なくなりました。私の標準ライブラリに 何か問題があったのかもしれません。

サンプルEAの一部から作成した修正EAを使用しています。私は最初、あなたのコードに何か問題があったのかと思いました。しかし、今はエラーがないとおっしゃるので、何が原因でそのような問題が発生したのかよくわかりません。もしまた問題が発生したら、ここかPMでお知らせください。
 

こんにちは、エンリコ、


ExpertAdvisorBaseで、Time関数が 以下のようになっています;

datetime CExpertAdvisorBase::Time(const int index=0)
  {
   if(index>=0)
     {
      double time[];
      if(CopyTime(m_symbol_name,m_period,index,1,time)>0)
         return(time[0]);
     }
   return(-1);
  }

上記の時間タイプはdatetimeではなくdoubleです。

datetime CExpertAdvisorBase::Time(const int index=0)
  {
   if(index>=0)
     {
      datetime time[];
      if(CopyTime(m_symbol_name,m_period,index,1,time)>0)
         return(time[0]);
     }
   return(-1);
  }

また、TimesBaseのEvaluate関数はデフォルト値を渡しません;

bool CTimesBase::Evaluate(datetime current) const

以下のように変更すれば、そうなるはずである;

bool CTimesBase::Evaluate(datetime current) const

BaseOrderフォルダをコンパイルすると、ファイルが多くのエラーを投げます。

例えば、以下のOrderBaseの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);
        }
     }
  }

Throws 'operator=' - 関数呼び出しに適用できるオーバーロードがありません OrderBase.mqh

'At' - オブジェクト・ポインタが期待される OrderBase.mqh

BaseStopもまた、StopsやTypesなどに関連する多くのエラーを投げるという同じ問題を抱えています。

お疲れ様でした。

 
こんにちは、シェップ、
Shephard Mukachi:

こんにちは、エンリコ、


ExpertAdvisorBaseで、Time関数が 以下のようになっています;

上記の時間タイプはdatetimeではなくdoubleです。

Shephard Mukachi:

こんにちは、エンリコ、


また、TimesBaseのEvaluate関数はデフォルト値を渡しません;

以下のように変更すれば、そうなるはずです;

ご指摘ありがとうございます。今まで気づきませんでした。コードを更新します。

シェファード・ムカチ

BaseOrderフォルダをコンパイルすると、ファイルがたくさんのエラーを投げます。

例えば、以下のOrderBaseのCreateStops関数;

Throws 'operator=' - 関数呼び出しに適用できるオーバーロードがありません OrderBase.mqh

'At' - オブジェクト・ポインタが期待される OrderBase.mqh

BaseStopもまた、StopsやTypesなどに関連する多くのエラーを投げるという同じ問題を抱えています。

Shepさん、お疲れ様でした。

はい、承知しています。これはやはり前方宣言が原因です。CStopはそのメソッドでCOrderとCOrderStopのインスタンスを必要とします。CStopをコンパイルしようとした場合も同様です。お互いを必要とするこれらのクラスは、すべて一緒にコンパイルする必要がある。それぞれを単独でコンパイルするとエラーが発生する。例えば

class Object1
{
public:
   Object2 *m_object2;
   Object1(){}
  ~Object1(){}
};

class Object2
{
public:
   Object1 *m_object1;
   Object2(){}
  ~Object2(){}
};

これはコンパイルできない。前方宣言を宣言して、コンパイラがobject1クラス内のクラス・メンバm_object2を認識できるようにする必要があります:

class Object2;
class Object1
{
public:
   Object2 *m_object2;
   Object1(){}
  ~Object1(){}
};

class Object2
{
public:
   Object1 *m_object1;
   Object2(){}
  ~Object2(){}
};

これは、Object1とObject2が同じファイルにある場合は問題ありません。もし、Object1とObject2が別々のファイルにある場合は、Object1のクラス・ファイルにObject2の前方宣言を作成し、Object1のクラス・ファイルにObject2の前方宣言を作成する必要があります。これは、2つのクラスのどちらかにメソッドを追加するまでは正しい。

現在のバージョンのコンパイラーは前方宣言を認識しますが、前方宣言されたクラスのリストされたメソッドは認識しません。そのため、"CStop - declaration without type "のようなエラー・メッセージは表示されませんが、上記のようなメソッドのコンパイラー・エラー・メッセージは表示されます。コンパイラーはクラスを認識しますが、順方向に宣言されたクラスのメソッドは認識しません。