[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 241

 
VOLDEMAR:

Pregunta sobre cómo calcular una serie de órdenes perdedoras ????

Quiero saber cuántas órdenes seguidas se cerraron en un stop para comprobar las tácticas... y especialmente la última

Chicos, realmente lo necesito .....


Así es como lo calculo para mí:

Iteración = cuántas veces una orden seguida ha cerrado en un stop si un stop en su sentido es un cierre con pérdidas.

 //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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;
               }
            }
         }
      }
   }
 
Gracias. Pero según tengo entendido este código encuentra toda la serie en la historia, ya sea hace 100 operaciones o 5 ....
 
VOLDEMAR:
Gracias. Pero según tengo entendido, este código encuentra toda la serie en el historial sin importar si fue hace 100 operaciones o 5 .....

No. La selección de la cerrada más cercana se adentra en el historial, y cuando una cerrada se convierte en ganancia, la serie se interrumpe con la salida del número de operaciones perdedoras consecutivas = Iteración.
 

Buenas tardes.

¿Será esta la combinación adecuada?

  // заполним значениями сигнальные массивы и посчитаем их количество
  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);
}
 

Me ha gustado este:)

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

Me gusta este:)


¿hay un error aquí?

Necesito devolver el valor de la barra donde Spread==0,

Si no se encuentra dicho valor, devuelve -1.

 

Hola.

Pregunta: ¿puede OrderSend() devolver un valor de "0", o menos de "-1" después de la ejecución? ¿Alguien se ha encontrado con algo así? ¿O es correcta la información que aparece en la "documentación"?

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)
Función básica utilizada para abrir una posición o establecer una orden pendiente.
Devuelve el número de billete asignado a la orden por el servidor de comercio, o -1 en caso de fallo.
P.D.: trabajando como telépata, buscando un error en el código de otra persona...
 
Hice un arrastre virtual con líneas horizontales, en el probador funciona bien, pero durante la optimización el probador aparentemente no funciona con estas líneas, ¿por qué?
 
DimaMA:
Hice un arrastre virtual con líneas horizontales, funciona bien en el probador, pero durante la optimización el probador probablemente no funciona con estas líneas, ¿por qué? y ¿cómo solucionarlo?

¿Por qué se necesita una línea horizontal? ¡¡¡Guarda el valor de la línea en una variable y serás feliz!!! ¡Y el Asesor Experto "pensará" más rápido! Y puedes dejar la línea horizontal sólo por efecto visual.

Y la razón es la siguiente: ¡el comprobador sólo trabaja con objetos gráficos en modo visual! Cuando se optimiza, no hay ningún modo visual... Aunque, puedes intentar dejar el gráfico con "visual" entre paréntesis después del nombre del TF y del par... Pero no sé si ayudará o no. No lo he comprobado. Pensé que ayudaría, porque podemos ver las órdenes que aparecen y desaparecen en este gráfico (que se utilizó para las pruebas de visualización antes) (aunque el gráfico no se ha activado todavía)... ¡Tal vez alguien nos lo diga!

Mi consejo es que no utilice la extracción de parámetros de los objetos gráficos. Que estos parámetros se almacenen en variables... No hagas que el objeto gráfico sea una variable. :))))

 
MaxZ:

Hola.

Pregunta: ¿puede OrderSend() devolver un valor de "0", o menos de "-1" después de la ejecución? ¿Alguien se ha encontrado con algo así? ¿O es correcta la información que aparece en la "documentación"?

P.D.: trabajando como telépata, buscando un error en el código de otra persona...

Hai!

¿Por qué no? Si un pedido no se abre debido a una recotización, por ejemplo.

Para ello existe un bucle para la apertura real de las órdenes, por ejemplo, así: el número de intentos de apertura con tratamiento de errores:

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);
   }      
}
Razón de la queja: