エラー、バグ、質問 - ページ 52

 
MT4ではそんなことなかったです、ありがとうございます。
 

Expert Advisorのテスト中。
Exp_TEMA.mq5、記事より。"異なるシンボルで取引するExpert Advisorの作成"。Told[] Tnew[1]式は以下の値を取得します。
Told[] 式が評価されませんでした。
Tnew[1] 無効な配列範囲です。

そして、My_First_EA.mq5、記事より。"初心者のためのMQL5 Expert Advisorの書き方ステップバイステップガイド "という表現があります。
New_Time[1]はInvalid array rangeという値を取得します。

Expression could not be evaluated, Invalid array range, and how does they affect EA results?

 

Told - サイズを指定しない空の配列

Tnew[1] - out ofarrayは Tnew[1]と記述されているため、インデックスが0から始まるため、その要素にはTnew[0]としてしかアクセスできない。

 
Renat:

Told - サイズを指定しない空の配列

Tnew[1] - out of arrayはTnew[1]と記述されているため、インデックスが0から始まるため、その要素にはTnew[0]としてしかアクセスできない。


Tnewについては、すでに他のフォーラムのスレッドで紹介しましたが、どうやら開発者のコメントが必要だったようです :)
 

1つの条件に対して1つの取引しか行わない方法を教えてください。私のコードでは、この条件で端末が複数のディールを開いてしまいますが、私は1つだけでいいのです。

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

その結果、次のような絵が出来上がりました。

この条件で取引されたかどうかを確認するにはどうすればよいですか?この方法で試しましたが、うまくいきません。

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

1つの条件に対して1つの取引しか行わない方法を教えてください。私のコードでは、この条件で端末が複数のディールを開いてしまいますが、私は1つだけでいいのです。

その結果、次のような絵が出来上がりました。

この条件で取引されたかどうかを確認するにはどうすればよいですか?この方法で試しましたが、うまくいきません。

また、PositionSelectという 素晴らしいものがあるのに、なぜループ内に検索を配置するのでしょうか?

ただ、面白い記号の上に位置があることを確認して、それが本当なら、コニャックを飲んで葉巻を吸いに行く...。:)

追記

私の理解では PositionSelectなしのPositionGetStringは 動作しないはず です。すべてのオープンポーズの記号を知る必要はないですよね?

 
Interesting:

PositionSelectの ような素晴らしいものがあれば、ループ内を検索する必要はないのでは

興味のあるツールのポジションの有無を確認し、その通りになったら静かにコニャックを飲み、葉巻を吸う...。:)

追記

私の理解では PositionSelectなしのPositionGetStringは 動作しないはず です。すべてのオープンポーズの記号を知る必要はないですよね?

このコードは、オープンポジションの存在を考慮したものです。

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

しかし、Buy_Signalの条件が満たされたときにポジションを開き続けます。私が欲しいのは、Sell_Signalが発生する前に、Buy_Signalのポジションが再びオープンしないようにすることです。私はこのように実装しようとしているのです。

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
行かないんです。
 
AM2:

このようなコードは、オープンポジションの存在を考慮に入れています。

しかし、Buy_Signalの条件が満たされると、ポジションを持ち続けることができます。Sell_Signalが発生する前に、Buy_Signalによってそれ以上のポジションがオープンされないことを確認する必要があります。私はこのように実装しようとしています。

それはない。

なぜこのコードなのか?私が言いたかったこととはほとんど見えません(そこがすべて正しいかどうかは疑問ですが)。

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

というような意味です。

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

せめてブロックでもいいのでは

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

なぜこのような特殊なコードなのか?私が言いたかったことと全然似ていない(全く合っていないと思う)。

というような意味です。

最低でも全てはブロック単位で行えます。

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

このコードと上記のコードは、ポジションを 閉じるまでオープン しませんが、条件が満たされた場合、次のバーでクローズした後、新たにオープンします。私はこのように実装しています。

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

ありがとうございました。皆様のご希望をすべて取り入れ、すべて動作するようになりました。Expert Advisorを公開しました。コードにもう少し手を加えることができます。誘惑に限界はない)))

 
MqlTradeCheckResultの取引要求 チェック結果の構造に対する応答コード(Retcode)の記述がドキュメントに見当たりません。あるのでしょうか?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5