記事"MQL5でExpert Advisorを書くための初心者向けステップバイステップガイド"についてのディスカッション - ページ 22

 
おはようございます。私の理解では、私は記事で示されているすべてのことをしました。しかし、著者が買いがあれば買いを、売りがあれば売りを発注 しないようにしたかったと理解している以上に、2つのオープン操作を同時に行うことができません。例えば、私のストラテジーは、買い注文があるときに売りシグナルを送りますが、売り注文を出す代わりに、tp/slに触れることなく買い注文を閉じます。そのため、買いも売りもできない。売りは買いを閉じ、買いは売りを閉じます。私のストラテジーでは、1つのペア、1つのタイムフレーム、1つのロットサイズしか使用していません。もしストラテジーがトリガーされれば、買いと売りを同時にオープンさせることができますか?つまり、注文はtp/slによってのみクローズされます。よろしくお願いします。
 
素晴らしい記事だ!
 
Sella170:
このEAをミニインデックスやミニドルに使えるかどうかご存知の方はいらっしゃいますか?
はい、マウスをチャートにドラッグするか、メニュー > 挿入 >エキスパートアドバイザー> {nomedoseurobo}でEAを使用することができます。

ご質問は解決しましたでしょうか?

 
素晴らしい記事をありがとうございます。あなたのコードのどこに、どのようにIntradayTime Filter モジュールを実装しますか?
 

おはようございます。

ガイドの最後にあるこのファイルを「ストラテジーテスター」に入れているのですが、次のようなエラーが表示されます:

*このエラーについては、この記事ですでに議論されていますが、どの解決策も私には役に立ちません。


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


ファイルはガイドの最後にあります。

どうすればこの問題を解決できますか?

 
surfdoode2:


また、提案された両方の修正を行ったが、まだこのエラーがある:

ZeroMemory(mrequest);

また

if(Buy_opened || Sell_opened)

エラー4756についてどなたか教えてください。買い注文ができないようです。

SymbolInfoTick 関数を使用して、コードのこの部分を書いたかどうかチェックしてください:

//--- MQL5 MqlTick構造体を使用して最後の価格提示を取得する
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
ここにはアルゴリズムのロジックに誤りがある:
 //--- すでにポジションは開いているか?
     bool Buy_opened= false ;   // 買いポジションの結果を保持する変数
     bool Sell_opened= false ; // セルのオープンポジションの結果を保持する変数
    
     if ( PositionSelect ( _Symbol ) == true )   // オープンしたポジションがある
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //これは買いだ
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // それは売りである
         }
    }

PositionSelectは_Symbolの最初のポジションを選択するため、EAが買いポジションをオープンすると、買いポジションがオープンしている間は常にSell_opened変数が偽となり、売りシグナルがあるたびに複数の売りポジションが実現することになります。

これを修正し、買いポジションと売りポジションが同時にオープンされているかどうかを知るには、以下のロジックを使用します:

 //--- すでにポジションは開いているか?
   bool Buy_opened = false ;   // 買いポジションの結果を保持する変数
   bool Sell_opened = false ; // セルのオープンポジションの結果を保持する変数

   if ( PositionSelect ( _Symbol ) == true ) // オープンしたポジションがある
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // それは売りである
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //これは買いだ
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

皆さん、おはようございます。

ガイドの最後にあるこのファイルを使って「ストラテジーテスター」をしているのですが、次のようなエラーが表示されます:

*このエラーについては、すでにこの記事で説明されていますが、どの解決策も私には役に立ちません。



ファイルはガイドの最後にあります。

どうすればこの問題を解決できますか?

mrequest.price、mrequest.sl、mrequest.tp変数をブレークポイントを使ってデバッグしてください。

変数を

mrequest.type_filling = ORDER_FILLING_FOK;                               // 注文の実行タイプ

に変更してみてください:

mrequest.type_filling = ORDER_FILLING_IOC;                               // 注文の実行タイプ


新聞によっては、最小ストップロス・ルールがあります。詳しくはこちらをご覧ください:https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

こんにちは、

サミュエルの記事をどうもありがとう!

私のブローカーで動作させるのは少し難しかったです。というのも、この記事は「ネット」モードになっており、「ヘッジ」モードにするための情報を探さなければならなかったからです。最初の問題はmrequest.type_filling でした。

XMブローカーの場合、機能するのはこれです:

mrequest.type_filling = ORDER_FILLING_IOC;                                          // 注文の執行タイプ

あなたのMT5がどれを許可しているかわからない場合、私のお勧めはPrint(TypeFilling ()) またはComment(TypeFilling ()) TypeFilling() 関数を使用することですmql5.com/docs/constants/tradingconstants/orderproperties#enum_order_type_filling)。なぜなら、ORDER_FILLING_FOK(1)はこのブローカーでは機能しないからだ。


これが修正されると、問題はPositionSelectが多くのポジションをオープンすることです。サミュエルはストラテジーの中でそのように言っていませんが、私は、確立された基準(4つのブールステップ)で単一の買いポジションまたは売りポジション(どちらか早い方)をオープンすることが目的であり、このポジションがクローズされるまで、次のポジションをオープンすることはできないと理解しています。

私がしたことは、このコードを変更することです.

//--- エラーはないので、続行する。
//--- ポジションはまだありますか?
    bool Buy_opened=false;  // オープンポジションの購入結果を格納する変数。
    bool Sell_opened=false; // オープンポジションの結果を格納する変数 セール
    
    if (PositionSelect(_Symbol) ==true)  // オープン・ポジション
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // 購入する
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // セール
         }
    }

このコードは

//--- エラーはないので続行する。
//--- ポジションはまだありますか?
   bool Buy_opened = false;               // 買い建玉の結果を格納する変数
   bool Sell_opened = false;              // 売り建玉の結果を格納する変数
   
   // すべてのオーダーを調べて、未解決のオーダーがないか確認しよう。
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // 購入する
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // セール
         }
   }

// オープンポジションがある場合は、アクティブな操作がクローズ(SLまたはTPにタッチ)されるまで待つ。
   if (Buy_opened || Sell_opened) return; 

注:直後の行は...

//--- 前のバーの終値を現在のバー(bar1)にコピーする。
   p_close=mrate[1].close;

この方法で私はうまくいった。お役に立てれば幸いです。

よろしくお願いします。

 
surfdoode2:


また、提案された両方の修正を行ったが、まだこのエラーがある:

ZeroMemory(mrequest);

また

if(Buy_opened || Sell_opened)

エラー4756についてどなたか教えてください。買い注文ができないようです。


多分、あなたのブローカーの Filling Type がORDER_FILLING_IOC になっているのでしょう:

mrequest.type_filling = ORDER_FILLING_FOK;

に変更してみてください:

mrequest.type_filling = ORDER_FILLING_IOC;

私も同じ問題がありましたが、解決しました。