私の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の例も同じです。
私のEAでいくつかのストップを使用してみました。manage_trades()関数を 追加し、最後のストップがアクティブになった(ポジションがクローズされた)後に表示されたのがこれです:
3つのストップを使っていますが、すべて仮想です。
それはロットに関するものです。私は固定ロット0.1を使っています。最初のクローズ後、残量は0.06。最後のクローズ(ボリュームを指定しないメインストップ)の後、上記のエラーが発生しました。
ロットが高いときは大丈夫です。あなたのEAの例も同じです。
ライブラリの最新版(この記事に添付されているもの)を使用していることを確認してください。また、EAのソースコードを添付していただけると助かります。
ライブラリの最新バージョン(この記事に添付されているもの)を使用していることを確認してください。また、EAのソースコードを添付していただけると助かります。
はい、この記事に添付されているファイルをすべて更新しました。しかし、もしかしたら、もう一度更新したのかもしれません。
stops_ha_ma2のサンプルで、MMを固定ロットに変更し、ロットサイズを小さな値に変更して試していただけますか?
はい、この記事に添付されているファイルをすべて更新しました。しかし、あなたがもう一度更新したのかどうかはわかりません。
stops_ha_ma2のサンプルで、MMを固定ロットに変更し、ロットサイズを小さな値に変更して試していただけますか?
こんにちは、エンリコ、
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などに関連する多くのエラーを投げるという同じ問題を抱えています。
お疲れ様でした。
こんにちは、エンリコ、
また、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 "のようなエラー・メッセージは表示されませんが、上記のようなメソッドのコンパイラー・エラー・メッセージは表示されます。コンパイラーはクラスを認識しますが、順方向に宣言されたクラスのメソッドは認識しません。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 クロスプラットフォームEA: ストップ はパブリッシュされました:
この記事では、2つのプラットフォームMetaTrader4とMetaTrader5との互換性を確保するために、EAのストップの実装について説明します。
ストップの作成の一般的な操作を次の図に示します。

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