Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 210

 

Buenas tardes.

Mi estrategia tiene en cuenta el spread, el spread está definido por una función:

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

Pero como el spread es constante en el probador de estrategias, necesito un emulador de spread aleatorio. Quiero emular los cambios de propagación en el probador en el rango de 2 a 3 puntos (4 dígitos) en el 80% de los casos y más de 3 puntos en el 20% de los casos. Alguna idea de cómo implementar esto, o enlaces donde se haya resuelto dicha idea.

 
artmedia70:


El error con el mago hace que su EA no vea que su posición está cerrada en un stop al cerrar en un stop. ¿Por qué? La respuesta es que abres una posición con magic 123 y envías la variable Magic a la función que comprueba el cierre de la posición en el stop. ¿A qué crees que equivale cuando se inicializa implícitamente? Cero. La función busca naturalmente posiciones con el número mágico 0 y es igual a 123 en sus posiciones. Y no estamos discutiendo, sólo... ...razonamiento... Compruebe la reacción de cierre en el tope:


No he mirado el resto de la lógica de tu EA "muerto" - te estaba ayudando a entender la función de verificación de cierre de la parada...


¡Artem! Buenos días. Gracias de nuevo por la ayuda.

He eliminado toda la lógica "muerta" innecesaria y he "revivido" las que quedaban.... por lo que tengo entendido.

Sólo queda una función, que me has ayudado a arreglar.

Pero los milagros comenzaron a suceder más allá de mi comprensión

1. Mi Asesor Experto abre operaciones al principio de cada vela (tengo una vela de 5 minutos)

e ignorando todas las condiciones.

Es decir, el control entra en la primera línea

double Precio=iOpen(Símbolo (),0,0);

Y luego salta a través de 11 líneas y llega a las siguientes líneas

Lote=0,1;

OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 );

2. Si eliminamos la línea que calcula el lote mínimo Lot=MarketInfo(Symbol(), MODE_MINLOT);

El Asesor Experto funciona bien, pero la función isCloseLastPosByStop no funciona.

Estuve esforzándome durante mucho tiempo..... pero fue en vano. Te agradecería que me dijeras dónde se esconde el error.

double   Lot = 0.1;                                          //я проинициализировал переменную
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);                      //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();                                   //запоминаем количество всех открытых ордеров
      if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)      //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)       //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))  //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);                  //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else                                                    //в противном случае(если функция на вернула ??????
                     {
                     Lot=0.1;                                             // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                      
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

solnce600:

Артем ! Добрый день! Еще раз спасибо за помощь.

Toda mi "lógica muerta" eliminó lo innecesario y "revivió" el resto.... por lo que tengo entendido.

Prácticamente sólo dejé la función, que me ayudaste a corregir.

Pero los milagros, que están más allá de mi comprensión, han comenzado a suceder.

Después de

 if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))

añadir todo al cuerpo { }

Lo siento, no soy Artem.

 
ALXIMIKS:

solnce600:

Después de

añadir todo al cuerpo { }

Siento no ser Artem.

Gracias.Perdóname por la primera vez.......(no sé cómo añadir el emoticono de broma)
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

t o Lote ???

 
ALXIMIKS:

solnce600:

Después de

añadir todo al cuerpo { }

Lo siento, no soy Artem.

Hice lo que dijiste..... por desgracia el asesor trabaja .... la función isCloseLastPosByStop no funciona

double   Lot=0.1;
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);  //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();               //запоминаем количество всех открытых ордеров
      if ((ot==0)                      //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
               
                {
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);            //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                            //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else  //в противном случае(если функция на вернула??????
                     {
                     Lot=0.1; // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                     } 
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

Este es un trozo de código de la función bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

¿Pero qué pasa si hay un deslizamiento de 3 pips? No está muy bien pensado ))

 if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
 
solnce600:

Usted entiende - no estoy realmente preocupado por ello todavía....

Llevo una semana intentando averiguar por qué esta función no funciona.

Es decir, necesito que la siguiente orden se abra con un volumen doble de la orden cerrada en el stop, y que la siguiente orden se abra con un volumen regular después del non-stop.


Corregir la lógica del trabajo, de lo contrario se tardará mucho tiempo en pensar
 
ALXIMIKS:

Este es un trozo de código de la función bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

¿Pero qué pasa si hay un deslizamiento de 3 pips? No está muy bien pensado ))


Ya ves - no me molesto con él todavía....

Llevo una semana intentando entender por qué esta función no funciona como yo quiero.

Es decir, necesito abrir la siguiente orden después del stop con un volumen doble de la orden que cerró en el stop, y después del non-stop, la siguiente orden se abre con un volumen regular.
 

¿Y por qué tocar el historial de pedidos? Mira el balance - donde fue en esa dirección y cambia el lote.

Si es sólo un robot que va a operar en su cuenta.

Razón de la queja: