オーダー変更時のエラー1 - ページ 2

 
borilunad:
ビクター、あなた、レナット、一般的に、正しく指摘し、アレクセイは、必要な最後のチェックを示し、以前に、意味のあいまいさを避けるために、すべてのニュアンスを持つ各パラメータのすべての必要なチェックを行い、任意の条件を欠場することなく!。
そんなことして何になるんだ?各関数で_LastErrorの 値をリセットしているためです。常にメモリにぶら下がっているわけでもないし...。
 
hoz:
何に使うの?全ての関数で_LastErrorを リセットしているからです。常にメモリにぶら下がっているわけでもないし...。
ごめんね、関数とチェックの被害者だねー。興味のある情報はチャートに出力し、エラーチェックは取引機能の 後にのみ印刷する!
 
evillive:
ただし、3つのパラメータのいずれにも変更がない場合は、OrderModifyにも手を加える必要がないことを確認する必要があります。

聞いていますよ。役に立たなかった。以下は、私の改造方法のコードの一部です。

   ResetLastError();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())         \\ Если работаем в тестере...
   {
      if ((OrderOpenPrice() != fd_OpenPrice) || (OrderStopLoss() != fd_NewSL) || (OrderTakeProfit() != fd_NewTP))
      
      if (!OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         CLogs.WriteLog (StringConcatenate ("fOrderModify(): ", CErrs.ErrorToString (_LastError)));
         Print (__FUNCTION__, ": ", "После модификации тикета № ", fi_Ticket);
         Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; OOP = ", fd_OpenPrice, "; SL = ", fd_NewSL, "; TP = ", fd_NewTP);
         return (false);
      }
   }
エラー値がリセットされていることがよくわかる。

そして、マーケット情報を取得する。テスターで修正した場合...ではアレクセイが 提案したテストを実行し...修正に失敗したら...ログを書き、ログに印刷する...

一般に、ResetLastError()...の間にエラーがないことが確認できる。そこに間違いはない。

ログです。

0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.34048; SL = 1.34125; TP = 1.33362
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.34048; fd_NewSL = 1.34125; fd_NewTP = 1.33362
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.34048; fd_NewSL = 1.34125; fd_NewTP = 1.33362
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.34048; SL = 1.34125; TP = 1.33362
2       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
3       20:24:08        2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
 
hoz:

聞いていますよ。役に立たなかった。以下は、私の改造方法のコードの一部です。

エラー値がリセットされていることがよくわかります。

そして、マーケット情報を取得する。テスターで修正した場合...ではアレクセイが 提案したテストを実行し...修正に失敗したら...ログを書き、ログに印刷する...

一般に、ResetLastError()...の間にエラーがないことが確認できる。そこに間違いはない。

ログです。

変更前のOOP、SL、TPの値が新しい値と同じかどうかログを取る必要があり、そうすればエラー1の原因も明確になります。
 

そういうことなんだ...。

Expert Advisorでは、このようにクラスメソ ッドを呼び出しています。

 if (OrderType() == OP_SELLLIMIT)
      {
         if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
            New_OOP = ND (fd_MurreyLevelsValue[11]);
         else New_OOP = OrderOpenPrice();
         if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
            New_SL = ND (fd_MurreyLevelsValue[12]);
         else New_SL = OrderStopLoss();
         if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
            New_TP = ND (fd_MurreyLevelsValue[2]);
         else New_TP = OrderTakeProfit();
         
         Print (__FUNCTION__, ": ", "New_OOP = ", New_OOP, "; New_SL = ", New_SL, "; New_TP = ", New_TP);
         Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
             
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[11])
         {
            if (New_OOP < Bid) continue;
            
            if (!CPosMan.fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
            {
               if (_LastError != 0)
                  CLogs.WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                                  CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
            }
            else
            {
               Print (__FUNCTION__, ": ", "Модификация тикета №", OrderTicket(), " успешно завершена!");
               Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
            }
         }
      }

気になるクラスのピースはこちら。

// 1.2 Функция модифицирует выделенный ордер (установка TP и SL). =========================================================================
bool PositionsManipulations::fOrderModify (int       fi_Ticket,             // OrderTicket()
                                           double    fd_OpenPrice,          // OpenPrice
                                           double    fd_NewSL,              // Новый StopLoss (УРОВЕНЬ !!!)
                                           double    fd_NewTP,              // Новый TakeProfit (УРОВЕНЬ !!!)
                                           datetime  fdt_Expiration = 0,    // Время истечения отложенного ордера
                                           color     fc_Arrow = CLR_NONE)   // Цвет стрелок модификации StopLoss и/или TakeProfit на графике
{
   Print (__FUNCTION__, ": ", "Вошли в функцию ");

//---- Проверяем необходимость модификации
   if (fd_NewSL == OrderStopLoss() && fd_NewTP == OrderTakeProfit())
       return (false);
//----
   string ls_fName = "fOrderModify()";
   int    li_Cnt = 0;
   double ld_Price;
   bool   lb_InvalidSTOP = false,
          lb_FixInvalidPrice = false;    // Флаг первоначальной коррекции отложки

//---- Получаем актуальную информацию по символу и текущему ордеру
   CBase.GetMarkerInfo (OrderSymbol(), fi_Ticket);
   
   Print (__FUNCTION__, ": ", "До проверки на FREEZELEVEL и STOPLEVEL  тикета № ", fi_Ticket);
   Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
   Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; OOP = ", fd_OpenPrice, "; SL = ", fd_NewSL, "; TP = ", fd_NewTP);
//---- Проверяем на условия FREEZELEVEL и STOPLEVEL
   if (!CheckLevelsBLOCK (3, SPos.gs_Symbol, SPos.gi_Type, fd_OpenPrice, fd_NewSL, fd_NewTP, lb_FixInvalidPrice))
   {
      if (StringLen (CErrs.ErrInf) > 0)
      {
         CLogs.WriteLog (CErrs.ErrInf);
         return (false);
      }
   }
   Print (__FUNCTION__, ": ", "После проверки на FREEZELEVEL и STOPLEVEL  тикета № ", fi_Ticket);
   Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; OOP = ", fd_OpenPrice, "; SL = ", fd_NewSL, "; TP = ", fd_NewTP);
   
   ResetLastError();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
      if ((OrderOpenPrice() != fd_OpenPrice) || (OrderStopLoss() != fd_NewSL) || (OrderTakeProfit() != fd_NewTP))
      
      if (!OrderModify (fi_Ticket, fd_OpenPrice, fd_NewSL, fd_NewTP, fdt_Expiration, fc_Arrow))
      {
         CLogs.WriteLog (StringConcatenate ("fOrderModify(): ", CErrs.ErrorToString (_LastError)));
         Print (__FUNCTION__, ": ", "После модификации тикета № ", fi_Ticket);
         Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; OOP = ", fd_OpenPrice, "; SL = ", fd_NewSL, "; TP = ", fd_NewTP);
         return (false);
      }
   }

これが私たちが欲しいログピースです。

0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Выбран тикет № 2
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Тикет № 2; OrderOpenPrice() = 1.34048; OrderStopLoss() = 1.34125; OrderTakeProfit() = 1.33362
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: New_OOP = 1.3401; New_SL = 1.34048; New_TP = 1.33667
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: MovingLimitPositions: Тикет № 2; OrderOpenPrice() = 1.34048; OrderStopLoss() = 1.34125; OrderTakeProfit() = 1.33362
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OrderOpenPrice() = 1.34048; OrderStopLoss() = 1.34125; OrderTakeProfit() = 1.33362
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.3401; SL = 1.34048; TP = 1.33667
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вошли в функцию
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.3401; fd_NewSL = 1.34048; fd_NewTP = 1.33667
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: fi_Type > 2 = true
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Ещё Чутка дальше
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Тикет № 2; fd_NewOpenPrice = 1.3401; fd_NewSL = 1.34048; fd_NewTP = 1.33667
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::CheckLevelsBLOCK: Вышли из функции
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: После проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.3401; SL = 1.34048; TP = 1.33667
2       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: modify #2  sell limit 0.10 EURUSD at 1.34010 sl: 1.34048 tp: 1.33667 ok
3       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1
 

説明しよう。変更は、fOrderModify()メソッドで行われる。本メソッド fOrderModify()の入力時には、本体の先頭にオーダーパラメータの現在値と新しい予定値が出力されます。見ることができます。

   Print (__FUNCTION__, ": ", "До проверки на FREEZELEVEL и STOPLEVEL  тикета № ", fi_Ticket);
   Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
   Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; OOP = ", fd_OpenPrice, "; SL = ", fd_NewSL, "; TP = ", fd_NewTP);

この作品は過去ログにあります。

0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Вошли в функцию 
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: До проверки на FREEZELEVEL и STOPLEVEL  тикета № 2
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OrderOpenPrice() = 1.34048; OrderStopLoss() = 1.34125; OrderTakeProfit() = 1.33362
0       21:11:44        2013.08.26 09:45  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; OOP = 1.3401; SL = 1.34048; TP = 1.33667
パラメータがすべて異なることがおわかりいただけると思います。特に問題はないはずです。
 
hoz:

そういうことなんだ...。

Expert Advisorでは、このようにクラスメソッドを呼び出しています。

気になるクラスのピースはこちら。

これが私たちが欲しいログピースです。

Bidの意味がわからないのですが、注文が保留になっている場合、Bidはどうなるのでしょうか?

if (OrderType() == OP_SELLLIMIT)
      {
         if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
            New_OOP = ND (fd_MurreyLevelsValue[11]);
         else New_OOP = OrderOpenPrice();
         if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
            New_SL = ND (fd_MurreyLevelsValue[12]);
         else New_SL = OrderStopLoss();
         if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
            New_TP = ND (fd_MurreyLevelsValue[2]);
         else New_TP = OrderTakeProfit();
         
         Print (__FUNCTION__, ": ", "New_OOP = ", New_OOP, "; New_SL = ", New_SL, "; New_TP = ", New_TP);
         Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
             
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[11])
         {
            if (New_OOP < Bid) continue;
            
            if (!CPosMan.fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
            {
               if (_LastError != 0)
                  CLogs.WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                                  CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
            }
            else
            {
               Print (__FUNCTION__, ": ", "Модификация тикета №", OrderTicket(), " успешно завершена!");
               Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
            }
         }
      }


Bidは常にSellLimitより低いので、if(New_OOP < Bid)の行は決して真にならない......。...それぞれ、支障なく改造が実施されています。

 
hoz:

エラー配列も作ってみてはどうでしょうか。変数_LastErrorには最後のエラーの番号が格納されることがドキュメントに白黒書かれています。そして、ResetLastError()関数でリセットされる。LastErrorの呼び出しの間にもうエラーがない場合、_LastErrorは最後のエラーの値を格納する。私のコードには、もうエラーはありませんでした。まあ、そういう問題じゃないんですけどね。

あなたは絶対に間違っています。最後のエラーは、多くの重要な機能でよくリセットされています。WinAPIでもそうなっています。

そのため、エラーコードが発生した直後にローカル変数 に保存し、多くの中間関数でこのシステム変数を10回クリアしてから使おうとしないことです。

 

申し訳ございませんが、SellLimitはdistを必要とします。

not if (New_OOP < Bid) continue; butif (New_OOP-dist*Point < Bid) continue;

 
hoz:

どうしたらこのクソエラーを解消できる?もう、うんざりです。関数の入力パラメータを全てチェックしています。私の場合、今のところ、こんな感じです。

つまり、パラメータが変更されていなければ、変更する必要はないのです。今までやったことなかったけど、やってみようと思って...。

そして、このように注文変更メソッドにパラメータが渡されます。

ログにNw出力。

だから、ジャーナルは、修正:OK、しかし、その後...のように通知します。がエラーになる。どのパラメータも変更されていません。

注文は保留されています。そのため、オープン、ストップ、テイクプライスを変更することがあります。そしてこれは、私の理解では、ドキュメントと矛盾するものではありませんでした。

このようなことに遭遇したことがある人はいますか?どうすれば解決するのか?

そして、どのパラメータも変更されていない場合は、保留中の注文を変更しようとはしません。