[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 241

 
VOLDEMAR:

質問 一連の負け注文を計算する方法は?

戦術を検証するために、何回連続でストップで決済した注文があるのか知りたい...特に最後の

みんな、本当に必要なんだ・・・・・。


私の場合はこうやって計算しています。

反復=あなたの感覚でのストップが損切りの終値であれば、連続した注文が何回ストップで引けたか。

 //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }
 
ありがとうございます。 しかし、私が理解するところでは、このコードは、それが100トレード前であろうと5トレード前であろうと、履歴の中の全シリーズを見つけるのです・・・。
 
VOLDEMAR:
ありがとうございます。 しかし、私が理解するところでは、このコードは、それが100トレード前であろうと、5 ......であろうと、履歴の中の全シリーズを見つけるのです。

いいえ、最も近いクローズドから選択して履歴を深く掘り下げ、クローズドが利益に転じた時点で、連続負けトレードの回数=Iterationを出力してシリーズを中断します。
 

こんにちは。

この組み合わせでいいのでしょうか?

  // заполним значениями сигнальные массивы и посчитаем их количество
  for(i=DisplayBars;i>=0;i--) 
  {

    
if (Prz0 == 0) 
       {
           f= GetBarNumWithZerroDist(i);// на этом баре пересечение
        if (f!=-1)
          {
           Price01 = iClose(Symbol_1,0,f);
           Price02 = iClose(Symbol_2,0,f);
           Prz0 = 1;
           i=f;
           }
       } 
   }
int GetBarNumWithZerroDist(int i)
{
double Smb1Cl0 = NormalizeDouble(iClose(Symbol_1,0,0),Digits);
double Smb2Cl0 = NormalizeDouble(iClose(Symbol_2,0,0),Digits2);
double Smb1Pnt = MarketInfo(Symbol_1, MODE_POINT);
double Smb2Pnt = MarketInfo(Symbol_2, MODE_POINT);
int    mBars   = MathMin(iBars(Symbol_1,0), iBars(Symbol_2,0));

    for (int f=i;f>=0;f--) 
    {
        Price1 =   NormalizeDouble(Lot*(Smb1Cl0 - iClose(Symbol_1,0,f)) / Smb1Pnt,0);
        Price2 = NormalizeDouble(K*Lot2*H*(Smb2Cl0 - iClose(Symbol_2,0,f)) / Smb2Pnt,0);
        Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)== 0) return(f);
    }
    return(-1);
}
 

私はこの作品が好きでした:)

if(MathAbs(Spread)== 0) return(f);
 
Roger:

私はこれが好きです:)


はエラーになるのでしょうか?

Spread=0となるバーの値を返す必要があります。

そのような値が見つからない場合、-1を返す。

 

こんにちは。

質問:OrderSend() は実行後、"0 "または"-1 "より小さい値を返すことができますか?このようなことに遭遇された方はいらっしゃいますか?それとも「資料」に記載されている内容が正しいのでしょうか。

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
ポジションを建てるときや、注文を出すときに使う基本的な機能です。
トレードサーバーが注文に割り当てたチケット番号、または失敗した場合は -1 を返します
追伸:テレパスとして働きながら、他人のコードのエラーを探す...。
 
テスターでは問題なく動作していますが、最適化ではこのような線が あると動作しないようです。
 
DimaMA:
私は水平線で仮想トロールを作りました、それはテスターでうまく動作しますが、最適化中にテスターはおそらくこれらの行で動作しません、なぜですか、そしてどのようにそれを修正するには?

なぜ水平線が必要なのですか?行の値を変数に格納すれば、ハッピーになれる!!!そして、Expert Advisorはより速く "考える "ようになります。また、横線は視覚的な効果だけで残してもかまいません。

その理由は、テスターはビジュアルモードでしかグラフィカルなオブジェクトを 扱えないからです。最適化の際、ビジュアルモードが全くない...。ただし、TFやペア名の後に括弧で「ビジュアル」と書いてチャートを残しておくようにするとか...。しかし、それが役に立つかどうかはわからない。確認はしていません。このチャート(以前、可視化テストに使用したもの)で注文が出たり消えたりしているのが見えるので、参考になるかと...(チャートはまだ起動していないのですが)。もしかしたら、誰かが教えてくれるかもしれませんね。

私からのアドバイスは、グラフィカル・オブジェクトからのパラメータ抽出を使用しないことです。これらのパラメータを変数に格納しておくと...。グラフィックオブジェクトを変数にするな!:))))

 
MaxZ:

こんにちは。

質問:OrderSend()は実行後、"0 "または"-1 "より小さい値を返すことができますか?このようなことに遭遇された方はいらっしゃいますか?それとも「資料」に記載されている内容が正しいのでしょうか。

追伸:テレパスとして働きながら、他人のコードのエラーを探す...

ハイ!

なぜダメなのか?再注文により 注文が開けない場合など。

このために、例えばこのような、注文を実際に開くためのループがあります - エラー処理で開くための試行回数。

int NumberOfTry = 25;
//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//+------------------------------------------------------------------+

void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0)
{
   color clr;
   datetime opentime;
   int ticket;
   int error;
  
   comment = WindowExpertName() + " " + GetNameTF(Period()) + " " + comment;
   int msl = MarketInfo(symbol, MODE_STOPLEVEL);
   clr = CLR_NONE;
   if (cmd == OP_BUY)  clr = ColorBuy;
   else if (cmd == OP_SELL)  clr = ColorSell;   
   if ((expiration > 0) && (expiration < TimeCurrent()))   expiration = 0;
  
   for (int try = 1; try <= NumberOfTry; try++)
   {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped()))      break;   
      while (!IsTradeAllowed())      Sleep(5000);
    
      RefreshRates();
      opentime = TimeCurrent();
      ticket = OrderSend(symbol, cmd, volume, price, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr);
      if (ticket > 0)
         if (UseSound)      {PlaySound("ok.wav"); break;}      
      else
      {
         error = GetLastError();
         if (error == ERR_TRADE_TIMEOUT)
         {
            Sleep(1000*66);
            if (ExistOrders(symbol, cmd, magic, opentime))
            {
               if (UseSound) {PlaySound("ok.wav"); break;}
            }
         }
        
         Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
         continue;
      }
      
      Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try);
      Print("Ask=", Ask, "  Bid=", Bid, "  symbol=", symbol, "  volume=", volume, "  cmd=", GetNameOP(cmd), "  price=", price, "  stoploss=", stoploss, "  takeprofit=", stoploss, "  magic=", magic);
      if ((error == ERR_COMMON_ERROR) || (error == ERR_ACCOUNT_DISABLED) || (error == ERR_INVALID_ACCOUNT) || (error == ERR_TRADE_DISABLED))
        {
         IsExpertFailed = true;
         break;
        }      
      if ((error == ERR_SERVER_BUSY) || (ERR_INVALID_TRADE_VOLUME) || (error == ERR_MARKET_CLOSED))
        {
         Sleep(1000*300); 
         break;
        }      
      if ((error == ERR_TOO_FREQUENT_REQUESTS) || (error == ERR_TOO_MANY_REQUESTS))    Sleep(1000*100);      
      if ((error == ERR_ORDER_LOCKED) || (error == ERR_LONG_POSITIONS_ONLY_ALLOWED) || (error == ERR_TRADE_TOO_MANY_ORDERS))      break;      
      if (error == ERR_TRADE_CONTEXT_BUSY) while (IsTradeContextBusy()) Sleep(1000*11);
      
      if (error == ERR_TRADE_EXPIRATION_DENIED )  {expiration = 0; continue;}      
      if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE))  Sleep(1000*7.7);
   }      
}