MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 504

 

みなさん、こんにちは。

なぜ簡単な条件がうまくいかないのか、半日かけて解明しました、よろしくお願いします。

      macd1 = iMACD (_Symbol,PERIOD_CURRENT,5,34,5,0,1,0);
      macd2 = iMACD (_Symbol,PERIOD_CURRENT,5,34,5,0,1,1);
      highprice1 = High [0];
      highprice2 = High [1];
      lowprice1 = Low [0];
      lowprice2 = Low [1];
              if (macd1 > 0 && macd1 > macd2 && highprice1 > highprice2) 
                 {
                 maxprice1 = highprice1;
                 macdMAXSell = macd1;
                 Print("maxprice1 = highprice1",maxprice1);
                 }
              if (macd1 < 0 && macd1 < macd2 && lowprice1 < lowprice2)
                 {
                 minprice1 = lowprice1;
                 macdMAXBuy = macd1;
                 Print("minprice1 = lowprice1",minprice1);
          	 } 

私は履歴データで実行されている、変数macd1,2、lowprice、highpriceは値が割り当てられていますが、条件は実行したくない、私は私の頭が掘る場所を理解することはできません壊した...(((

 
Nikolay Gaylis:

1 と 1 かもしれない /true とエラーコード 1 です。

ERR_NO_RESULT1エラーは発生しないが、結果は不明

全く混乱し、何をやっているのか理解できない

bool takelimit;   // Здесь переменная равна false

//--- Здесь вот что: сначала выбирается ордер по тикету (MODE_TRADES здесь не нужно от слова "совсем", что говорит о том, что вы не представляете что вы делаете), 
//--- далее переменной takelimit присваивается результат работы функции выбора ордера, 
//--- и если ордер есть с таким тикетом, или был когда-то, то функция вернёт true, и takelimit будет присвоено true, соответственно, будет выведен код последней ошибки,
//--- что вовсе не говорит, что ошибка здесь была при выборе ордера по тикету - вы же переменную, хранящую код последней ошибки, не сбросили при помощи ResetLastError()
//--- И далее вообще не понятно к чему у вас фигурные скобки - они висят в пустоте, а это составной оператор, который должен после условия идти.

if(takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
   Print(string(takelimit)+"   :",GetLastError());//здесь возвращает число 11, получается ошибка код 11, но не нашел расшифровку нигде?
  {
   if(iBarShift(Symbol(),0,OrderOpenTime())==1)
      deletelimit=OrderDelete(ticket);
   if(!deletelimit)
      Comment(GetLastError());
  }
//+------------------------------------------------------------------+
//--- А нужно примерно так (фигурные скобки специально оставил для понимания где какой блок кода):
   ResetLastError();
   if(OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0)
     {
      if(iBarShift(Symbol(),PERIOD_CURRENT,OrderOpenTime())==1)
        {
         if(!OrderDelete(ticket))
            Print("Ошибка удаления ордера #",(string)ticket,": ",GetLastError());
        }
     }
   else
     {
      Print("Ошибка выбора ордера #",(string)ticket,": ",GetLastError());
     }
 
Вадим Мотеюнас:

Print(takelimit,GetLastError()) は、1番目の変数がbool型なのでGetLastErrorを必要とせず、カンマがあるのでGetLastErrorはGetLastError呼び出し時のコードで最後のエラーを返すので2値を返しますか

ああ...印刷する値が2つある......。

ほぼその通りのことを書いていますね。

int ticket;

void Fn()
  {
   ResetLastError();//Сбрасываем код предыдущей ошибки
   if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){Print(GetLastError());}//Если не выбран ордер по указанному тикету-принтим код ошибки
   else//иначе(если ордер нашёлся)
     {
      if(iBarShift(Symbol(),0,OrderOpenTime())==1 && !OrderDelete(ticket)){Comment(GetLastError());}//Если выбранный ордер открылся на предыдущем баре и не удалось его удалить(надеюсь Вы работаете с отложенниками)-тогда выводим комент ошибки
     }
  }
 
Nikolay Gaylis:

はい...印刷する値は2つです...。

ほぼその通りのことを書いていますね。

そして、あなたも...。
また、注文がすでに削除されている場合はどうするのですか?
 
Artyom Trishkin:

完全な混乱と勘違い...。

実際には何もしていないのですが、男が11の代わりに1と1をプリントすると思い込んでいただけなのです))

ということで、以上です...

 
Artyom Trishkin:

完全に混乱と誤解を招いている...。

あ...レス先が違うのか...なるほど)

 
Nikolay Gaylis:

実際には何もしていないのですが、相手が11ではなく、1と1をプリントすることを想定しています)。

ここのセリフのようにね。

Print(string(takelimit)+"   :",GetLastError());

11 "と印字すればよいのでしょうか?

その時は「1:1」と表示されますよ。

エラーコード 1は、エラーは発生していないが、結果は不明である。

 
Artyom Trishkin:

ここのセリフのようにね。

11 "を印刷できるのか?

その時は「1:1」と表示されますよ。

エラーコード 1は、エラーは発生していないが、結果は不明である。

はい、もう変えました!(笑

 
Nikolay Gaylis:

あ...レス先が違うんですね...なるほど)

はい、私はあなたが返信していたのと同じ人に返信していたのです。しかし、あなたは間違ったことも伝えました。MODE_TRADESが必要なときとそうでないときを読み分けてください。また、チケット上でどのように注文を選択 するべきか。

 
Artyom Trishkin:

まあ、そうですね、私はあなたが答えているのと同じ人に答えていたのです。MODE_TRADESが必要なときと不要なときを読み取ることです。また、チケット上でどのように注文を選択 するべきか。

MODE_TRADESはまだ見ていません、11がプリントされた作品だけですが...。