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

 
hoz:

ボリス 仮にそうだとすると......。想定しています。しかし、関数が注文を修正するために再送信する場合、有意差は修正されるべきです。そして、私の場合は、まったく修正しないのです。過去ログで見ても、見えてくるのはこうだ。

なぜ注文が送信されるのですか?正しいパラメータがなかったら、関数が吹っ飛んでしまうところだった......。OKという感じです...。...送信されました。すると、エラーがあることが判明し...。どのような理屈なのでしょうか。

電源を入れたばかりなのに!Victorの場合、"ok "であれば、何らかのパラメータが変更されたことを意味し、エラー1は、何らかのパラメータが変更されると宣言されたが、変更されないことが判明したことを意味します。だからこそ、そのようなケースを避けるために、あなたのロジックを修正する必要があるのです。このような不正確なロジックはすべて、実際のマーケットでリクオートと多くのエラーを引き起こすことになります

私がこのようなプログラミングスタイルをとらないのは、すべてがあちこちに散らばっていることをご存じだからです。プログラムを論理的なスクリプトとして書き、すべてのイベントが順次展開され、何かを探して探し回ることなく、すべての条件が常に手元にある状態です。そして、最終的な動作やエラーチェックは外部関数で行って います。

しかし、あなたの場合、何があってどこにチェックが入っているのかが素人には不明で、すべてが隠されていて、前提条件をチェックしたかどうかを推測しなければならないのです今の私のような言葉ですが、あなたのプログラムでは意味が伝わらないのです。明確で簡潔であるべきです

 

ボリス もちろん、すべてを一度に把握できているわけではないことは承知しています。しかし、修正関数の直前の入力パラメータはドッキングされています。スクリーンショットを投げたところです。PLOは現行と 新が あり、SLとTPがあります。そして、それらはすべて異なっている。すべてが近くにあるのに、なぜ細かいことを言わなければならないのか。無印で、パラメータが違うことがわかると、確かに違うということになります。それとも、印刷物も信用しないほうがいいのでしょうか?

2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; New_OOP = 1.34048; New_SL = 1.34125; New_TP = 1.33362
2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify:  Тикет № 2; OrderOpenPrice() = 1.34048; OrderStopLoss() = 0.0; OrderTakeProfit() = 0.0
2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: Тикет № 2; New_OOP = 1.34048; New_SL = 1.34125; New_TP = 1.33362
2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: _LastError = 0
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
2013.08.26 00:00  Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1

そしてその前に、上に示したように、テストがあるのです。

 if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP))
{
 ... Если какой-то из параметров отличается от нового, значит выполняется это условие...
}

もっと具体的に教えてください。上のほうには、作り話を始めた道化師が何人かいる。どうやら、私が尋ねていることを理解できない、あるいは理解しようとしないようだ。だから、彼らは意味もなく笑っているんです。しかし、その疑問は興味深いものです。

例えば、OrderModify()に別の型のパラメータや間違った数量を挿入すると、一度にエラーが発生します。そして、ここで実行され、OKのように表示されますが、その後、パラメータが変更されていないことが判明します。

問題は、そこで何が問題なのか、どうすればわかるのか、ということです。自分の機能を並べました。そこですべてがクリアになるはずです。これです。

// 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, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_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, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
   
   ResetLastError();
   
//---- Определяем цвет значков модификации ордеров
   if (fc_Arrow == CLR_NONE)
       fc_Arrow = ColorByModify [OrderType() % 2];
   
//---- Выполняем модификацию в тестере
   if (!CBase.GetRealTrade())
   {
      if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP))
      {
      ResetLastError();
      
      Print (__FUNCTION__, ": ", " Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
      Print (__FUNCTION__, ": ", "Тикет № ", fi_Ticket, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
      Print (__FUNCTION__, ": ", "_LastError = ", _LastError);
      
      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, "; New_OOP = ", fd_OpenPrice, "; New_SL = ", fd_NewSL, "; New_TP = ", fd_NewTP);
         return (false);
      }
      }
   }
   

わざと全部の行をコメントアウトしたんです。コードを台無しにするだけかもしれません。何かコメントがあれば、ご協力お願いします。

 
hoz:

ボリス もちろん、すべてを一度に把握できているわけではないことは承知しています。しかし、修正関数の直前の入力パラメータはドッキングされています。スクリーンショットを投げたところです。PLOは現行と 新が あり、SLとTPがあります。そして、それらはすべて異なっている。すべてが近くにあるのに、なぜ細かいことを言わなければならないのか。無印で、パラメータが違うことがわかると、確かに違うということになります。それとも、印刷物も信用しないほうがいいのでしょうか?

そしてその前に、上に示したように、テストがあるのです。


すべて

申し訳ありませんが、orderパラメータが互いに混同されないようにする条件がループ内に見当たらないため、意味を理解することができないのです

エラーがあるということは、どこかで論理的な間違いを犯していることを物語っています。ただ、「プログラムが動く」とも書いてありますが、プログラムの質が気になるところです

 
borilunad:

すみません、orderパラメータが互いに混同されないようにする条件がループ内に見当たらないので、これを把握することができないのです

エラーがあるということは、どこかで論理的な間違いを犯していることを物語っています。ただ、「プログラムが動く」とも書いてありますが、プログラムの質が気になるところです


注文に関するすべての操作は、ループの中で行われますここで、先に引用したfOrderModify()というメソッドが呼び出されるわけです。

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                   Перенос лимитных ордеров по сигналу                                                 |
//+---------------------------------------------------------------------------------------------------------------------------------------+
void MovingLimitPositions (const double& fd_MurreyLevelsValue[])
{
   double New_OOP = 0.0,
          New_SL = 0.0,
          New_TP = 0.0;
   int    Ticket = -1;
   
   for (int i=0; i<13; i++)
   {
      Print (__FUNCTION__, ": ", "fd_MurreyLevelsValue["+IToS (i)+"] = ", DToS (fd_MurreyLevelsValue[i]));
   }

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      New_OOP = 0.0;
      New_SL = 0.0;
      New_TP = 0.0;
      
      ResetLastError();
      
      if (!CPosMan.CheckMyOrdersBased(i, 7)) continue;
      if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;

      Ticket = OrderTicket();

      Print (__FUNCTION__, ": ", "Выбран тикет № ", OrderTicket());
      Print (__FUNCTION__, ": ", "Тикет № ", OrderTicket(), "; OrderOpenPrice() = ", OrderOpenPrice(),
             "; OrderStopLoss() = ", OrderStopLoss(), "; OrderTakeProfit() = ", OrderTakeProfit());
          
      if (OrderType() == OP_BUYLIMIT)
      {
         if (ND (OrderOpenPrice()) != ND (fd_MurreyLevelsValue[1]))
            New_OOP = ND (fd_MurreyLevelsValue[1]);
         else New_OOP = ND (OrderOpenPrice());
         if (ND (OrderStopLoss()) != ND (fd_MurreyLevelsValue[0]))
            New_SL = ND (fd_MurreyLevelsValue[0]);
         else New_SL = ND (OrderStopLoss());
         if (ND (OrderTakeProfit()) != ND (fd_MurreyLevelsValue[10]))
            New_TP = ND (fd_MurreyLevelsValue[10]);
         else New_TP = ND (OrderTakeProfit());
         
         Print (__FUNCTION__, ": ", "New_OOP = ", New_OOP, "; New_SL = ", New_SL, "; New_TP = ", New_TP);
         
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[1])
         {
            if (!CPosMan.fOrderModify (OrderTicket(), 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(), " успешно завершена!");}
         }
      }
      
      if (OrderType() == OP_SELLLIMIT)
      {
         if (ND (OrderOpenPrice()) != ND (fd_MurreyLevelsValue[11]))
            New_OOP = ND (fd_MurreyLevelsValue[11]);
         else New_OOP = ND (OrderOpenPrice());
         if (ND (OrderStopLoss()) != ND (fd_MurreyLevelsValue[12]))
            New_SL = ND (fd_MurreyLevelsValue[12]);
         else New_SL = ND (OrderStopLoss());
         if (ND (OrderTakeProfit()) != ND (fd_MurreyLevelsValue[2]))
            New_TP = ND (fd_MurreyLevelsValue[2]);
         else New_TP = ND (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 (!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());
            }
         }
      }
   }
   Print (__FUNCTION__, ": ", "OUT OF FUNCTION");
}

そこですべてを見ることができる...また、ループの各反復の後、エラーがクリア されていることがわかります。したがって、前の順番でエラーがあったとしても、その事実が次の順番に飛び火しないことが保証されています(もちろん、その値のことです)。

どこまで簡単にできるのか?とても簡単なことなのですが・・・。

 

メッセージを 発見しました。

同じ端末のバグです。こんなバグは初めてです。保留中の注文の3つのパラメータ(OOP、SL、TP)を変更することは、今まで試したことがありません。でも、そうせざるを得なかったんです。そして、バグに遭遇してしまった。

なるほど、例えば、建値とStop Lossが変わっていない代わりに、同じ値が表示されても、Take Pointが変わっている場合は、そのように表示されるのですね。これもエラーの原因になるのでしょうか?すると、文書が曲がっていることが判明。そして、この点が支持されていないとか、なんだとか。

 
hoz:

メッセージを 発見しました。

同じ端末のバグです。こんなバグは初めてです。今まで、保留中の注文の3つのパラメータ(OOP、SL、TP)を変更しようとしたことはありませんでした。でも、そうせざるを得なかったんです。そして、バグに遭遇してしまった。

なるほど、例えば、建値とStop Lossが変わっていない代わりに、同じ値が表示されても、Take Pointが変わっている場合は、そのように表示されるのですね。これもエラーの原因になるのでしょうか?すると、文書が曲がっていることが判明。そして、この点が支持されていないとか、なんだとか。

距離も1ティックごとに確認するのですか?私はずっと以前から、TFバーのオープニングで注文を出し、M1のバーのオープニングでのみ注文を修正・決済するというルールを採用しています。上記のコードは、すべてを含んでいるようで、具体的なものが何もない進捗報告書を思い出させるものです特定の条件によってすべてのアクションを定義するようなループは見当たりません。何も修正しない、それなら修正しなければいい、エラーは出ない、というループしか見えません。

Renat の重要な観察によれば、エラーはグローバルに行うべきこととローカルに行うべきことの混乱から生じることがあり、エラーは常に後者で、以前のものは関数の終了に関与せずにリセットされるのだそうです

 
borilunad:

距離も1刻みで確認するのか!?

いいえ!条件を満たした場合のみ、修正を許可しています。この場合、算出されたレベルを変更することが修正の条件となる。ただ、それだけなんです。

void OnTick()
{
   static double FirstInd = 0.0;                    // Переменная, которая хранит значение 1-ого индекса массива
   double MurreyLevelsValue[13];                    // Массив значений уровней
   GetDataFromIndicator (MurreyLevelsValue);        // Функция, которая получает значения из индикатора уровней
   
   if (gdt_LastBarTime <= Time[0])
   {
      OTotal = CPosInf.FindPositions (AmountPosByType);   // Получаем количество позиций( по типам ).
      
      GetTradeSignal (MurreyLevelsValue);
      
      gdt_LastBarTime = Time[0];
   }

   if (FirstInd != ND (MurreyLevelsValue[1]))      // Если значений текущего состояния переменной FirstInd не равно новому рассчитанном, то.. 

   {
      MovingLimitPositions (MurreyLevelsValue);     // ..модифицируем ордер новым значением
      FirstInd = ND (MurreyLevelsValue[1]);
   }
}

シンプルに?ちょっと...

ボリルナド


昔、TFのバーオープンで注文を出し、M1のバーオープンでだけ修正・決済するルールを作ったんだ。上記のコードは、すべてを含んでいるようで、具体的なものは何もない、進捗報告書を思い出させます特定の条件によってすべてのアクションを定義するようなループは見当たりません。何も修正しないでください、それなら修正しないでください、エラーはありません、というループしか見えません。

M1のオープン時のみ修正するというのは、私も同じような考えを持っていました。しかし、M1でこのデータを確認する必要がない場面もある。例えば、すでに計算済みの水準でストップを引いている。それから、上に示したように、OnInit()関数でチェックを入れています。

if (FirstInd != ND (MurreyLevelsValue[1]))
{
   MovingLimitPositions (MurreyLevelsValue);
   FirstInd = ND (MurreyLevelsValue[1]);
}
すなわち、レベルが変更された場合、それは...を修正します。これにより、不必要な修正作業を回避することができます。いわば、タイマーではなく、信号による改造です。ここで理解できたか?


ボリルナド


特定の条件によってすべてのアクションを定義するループはないのか!何も修正しないで、修正しないだけで、エラーも出ないというループしか見られません。

外で全部脱がせています。何がわからないのか...。:(

ボリルナド

Renat の重要な指摘に注意してください。エラーは、グローバルに行うべきこととローカルに行うべきことの混乱から来るもので、エラーは常に後者です。

この問題は、私だけでなく、多くの人が抱えています。ここで一例を・・・。

そして、それは解決されなかったし、これからもされないようです。開発者が怠け者なのでは?もし私がエラーで正しく動作していないのであれば、レナートを含む誰かが、私が間違っていると言うだけでなく、コードをつつくことができたはずです。

結局のところ、修正するパラメータの新しい値と現在の値が修正関数の前に出力されれば、これらの値が存在することは明らかです。なぜ、どこか高いところに行くのか?値があり、エラーがないことがわかります(エラーがあるためそこに印刷しました)。論理的にはすべてうまくいくということです。つまり、修正機能の不具合ですね。

 
hoz:

いいえ!条件を満たした場合のみ、修正を許可しています。この場合、算出されたレベルを変更することが修正の条件となる。ただ、それだけなんです。

シンプルに?ちょっと...

M1のオープニングだけ修正するというのは、私も同じようなことを考えていましたし、あらかじめ決められた値で修正するのであれば、これは適用できます。しかし、M1でこのデータを確認する必要がない状況もある。例えば、すでに計算済みの水準でストップを引いている。それから、上に示したように、OnInit()関数の中にチェックが入っています。

すなわち、レベルが変更された場合、それは...を修正します。これにより、不必要な修正作業を回避することができます。いわば、タイマーではなく、信号による改造です。ここで理解できたか?


そこですべてを解き放ちました。何がわからないのか...。:(

この問題は、私だけでなく、多くの人が経験していることです。ここで一例を・・・。

そして、それは解決されていないし、これからもされないようです。開発者が怠け者なのでは?もし私がエラーで正しく動作していない場合、Renatを含む誰かがコードをつつくことができ、私が間違っていると言うだけではありません。

結局のところ、修正するパラメータの新しい値と現在の値が修正関数の前に出力されれば、これらの値が存在することは明らかです。なぜ、どこか高いところに行くのか?値があり、エラーがないことは明らかです(エラーがあるためそこに印刷しました)。論理的にはすべてうまくいくということです。つまり、改造機能に不具合があるわけです。

この例はすでに見ています。しかし、どんな条件でも、これ以上のものはないというまで適用しなければならないのです。あなたのコードでは説得力がない。これから昼食をとってから、SLの設定、B/Sへの変換、modify関数を1回呼び出すだけのトローリングで問題なく動作するループの例を挙げますと、エラーは、仕事で突然発生してもテスターで発生しないように処理されています。

Modify()関数は必要ですか?

 
hoz:

結局のところ、修正するパラメータの新しい値と現在の値が修正関数の前に印刷されていれば、これらの値があることは明らかである。なぜ、どこか高いところに行くのか?値があり、エラーがないことは明らかです(エラーがあるためそこに印刷しました)。論理的にはすべてうまくいくということです。つまり、修正機能の不具合ですね。

コードは問題ないようですが...実機では(デモではなく)動作するのでしょうか?
 

Victorさん、保留ポジションのSLとTPを修正したのはなぜですか?一般的には、ポジションを建てた 後にSLを設定し、SLをB/Sに移した後にTPを設定するのが理にかなっているのだそうですでは、なぜ無駄にサーバーに迷惑をかけるのか、なぜこんな面倒なことをしなければならないのか!?

コードを最小限にして単純化し、速く明確に動作するようにしなければなりません。そうすれば、市場の気まぐれで微調整することも簡単になるでしょう市場の実情に合わせたニュアンスでじっくり考えてみてください