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

 
Ekburg:

Cielos... Estoy ciertamente contento de que usted comenzó a resolver el problema, pero mi mensaje que de alguna manera no han notado, donde dije lo mismo, un poco diferentes palabras, y de inmediato dijo que las deficiencias, excepto para cerrar el archivo, no vio inmediatamente donde usted tiene que sucede:)

Has escrito una respuesta de tres puntos. En el primero te equivocaste (mi entrada es bastante correcta), en el segundo también te equivocaste (aunque este mensaje lo niveló :) El tercer punto sonó como si hubieras sugerido mover el cursor al final después de la entrada, no antes (lo que se tomó como un error de nuevo). Ante tal panorama, preferí hacer una aclaración de un moderador muy experimentado que me respondió.

No obstante, gracias por su comentario. ¡Y un feliz año nuevo! :)

 

Hola. Ante una situación desagradable. Ayúdame.

Tengo un Asesor Experto. Funciona bien en el Probador de Estrategias, no tengo ninguna reclamación. Cuando lo ejecuto en una demo, el Asesor Experto no puede colocar stops en ciertas órdenes. Hay un error que aparece no siempre, pero a veces. Estoy desesperado por encontrarlo por mi cuenta y espero contar con su ayuda. Cabe destacar que el EA funciona perfectamente en todos los demás aspectos, al igual que en el probador, no hay quejas, salvo que el problema es que no siempre se ponen los stops. El error aparece en diferentes corredores en diferentes cuentas. Esta es la parte del código responsable de las operaciones comerciales

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Este es el código de la función Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

Así, cuando el EA falla en la fijación de los stops, aparece un mensaje mostrando información sobre el error y los parámetros de la orden que intentó modificar. Lo que escribe es el verdadero misterio para mí. Como puedes ver en las imágenes de abajo, escribe constantemente que el volumen está mal. Esto es extraño. Debo añadir que todos los parámetros del pedido se calculan correctamente antes de la modificación, se puede ver en los mensajes. De lo contrario, el error sería diferente. El programa se probó con un diferencial más alto que el de la demo.

Enigmaotro

 
_Vladimir_:

Hola. Ante una situación desagradable. Ayúdame.

Tengo un Asesor Experto. Funciona bien en el Probador de Estrategias, no tengo ninguna reclamación. Sin embargo, cuando lo ejecuto en una demo, veo que el EA no puede colocar stops en ciertas órdenes. Hay un error que aparece no siempre, pero a veces. Estoy desesperado por encontrarlo por mi cuenta y espero contar con su ayuda. Cabe destacar que el EA funciona perfectamente en todos los demás aspectos, al igual que en el probador, no hay quejas, salvo que el problema es que no siempre se ponen los stops. El error aparece en diferentes corredores en diferentes cuentas. Esta es la parte del código responsable de las operaciones comerciales

Este es el código de la función Error(int er)

Así, cuando el EA falla en la fijación de los stops, aparece un mensaje mostrando información sobre el error y los parámetros de la orden que intentó modificar. Lo que escribe es el verdadero misterio para mí. Como puedes ver en las imágenes de abajo, escribe constantemente que el volumen está mal. Esto es extraño. Debo añadir que todos los parámetros de la orden se calculan correctamente antes de la modificación, se puede ver en los mensajes. De lo contrario, el error sería diferente. El programa se probó con un diferencial más alto que el de la demo.

Tenga cuidado con los valores de sus variables globales. Puedo asumir que ord_ticket es una variable global, lo que significa que el valor anterior puede ser almacenado en ella. Y antes de llamar a GetLastError() para capturar el error, debe restablecer el valor anterior llamándolo al principio del código.
 
TarasBY:
Debes tener mucho cuidado con los valores de tus variables globales. Puedo sugerir que ord_ticket es una variable global y por lo tanto puede almacenar el valor anterior. Y antes de llamar a GetLastError() para capturar el error, debes restablecer el valor anterior llamándolo al principio del código.

ord_ticket se declara a nivel local. Y entonces, aunque se declare globalmente en la primera línea

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

su valor cambiará sin duda. Será el número de orden en caso de transacción exitosa, o -1 en caso contrario. Así, si la orden no se abre, no llegamos al bloque de fijación de stops.

También hay que tener en cuenta que la función OrderSend() siempre cambia el valor del último error(según la documentación y la lógica), por lo que restablecer la lectura anterior en este caso no es necesario y resultaría una simple pérdida de tiempo. Es decir, el error 131 aparece después de entrar en el bloque de ajuste de parada y antes de que aparezca el mensaje de error. Como los topes no están realmente colocados, la función OrderModify() debe ser la última función en ser llamada, la cual, al igual que la anterior, siempre cambia el valor del último error. Pero no puedo entender por qué no cambia el valor del último error. ¿De dónde viene? Una vez más diré que no hubo problemas en el probador.

Tenía la idea de que el broker hacía trampa porque el servidor enviaba los números de error al terminal y éste a su vez los enviaba al Expert Advisor. He abandonado esta idea porque sólo las órdenes de un EA tienen errores, otros EAs que trabajan en paralelo no tienen tales errores.

 
_Vladimir_:

ord_ticket se declara a nivel local. Y entonces, aunque se declare globalmente en la primera línea

valor es seguro que cambiará. Será el número de orden en caso de transacción exitosa, o -1 en caso contrario. Así, si la orden no se abre, no llegamos al bloque de fijación de stops.

También hay que tener en cuenta que la función OrderSend() siempre cambia el valor del último error (según la documentación y la lógica), por lo que restablecer la lectura anterior en este caso no es necesario y resultaría una simple pérdida de tiempo. Es decir, el error 131 aparece después de entrar en el bloque de ajuste de parada y antes de que aparezca el mensaje de error. Como los topes no están realmente colocados, la función OrderModify() debe ser la última función en ser llamada, la cual, al igual que la anterior, siempre cambia el valor del último error. Pero no puedo entender por qué no cambia el valor del último error. ¿De dónde viene? Una vez más diré que no hubo problemas en el probador.

Tenía la idea de que el broker hacía trampa porque el servidor enviaba los números de error al terminal y éste a su vez los enviaba al Expert Advisor. He abandonado rápidamente esta idea porque sólo las órdenes de un EA tienen errores, otros EAs que trabajan en paralelo no tienen tales errores.


Yo añadiré. El código del EA que trabaja en paralelo es exactamente el mismo, se encarga de fijar los stops. Este EA nunca ha tenido una situación en la que no se hayan fijado los stops para las órdenes.

Parece que hay un error en el cálculo de los parámetros en alguna parte de arriba, pero si sólo un parámetro está mal, debería aparecer otro error. Por ejemplo, el conocido 130

 
_Vladimir_:

ord_ticket se declara a nivel local. Y entonces, aunque se declare globalmente en la primera línea

su valor cambiará sin duda. Será el número de orden en caso de transacción exitosa, o -1 en caso contrario. Así, si la orden no se abre, no llegamos al bloque de fijación de stops.

También hay que tener en cuenta que la función OrderSend() siempre cambia el valor del último error (según la documentación y la lógica), por lo que restablecer la lectura anterior en este caso no es necesario y resultaría una simple pérdida de tiempo. Es decir, el error 131 aparece después de entrar en el bloque de ajuste de parada y antes de que aparezca el mensaje de error. Como los topes no están realmente colocados, la función OrderModify() debe ser la última función en ser llamada, la cual, al igual que la anterior, siempre cambia el valor del último error. Pero no puedo entender por qué no cambia el valor del último error. ¿De dónde viene? Una vez más diré que no hubo problemas en el probador.

Tenía la idea de que el broker hacía trampa porque el servidor enviaba los números de error al terminal y éste a su vez los enviaba al Expert Advisor. Rápidamente he abandonado esta idea porque sólo las órdenes de un EA tienen estos problemas, otros EAs que trabajan en paralelo no tienen errores.

¡El pensamiento es la carrera! Pero la experiencia demuestra que lo que pensamos (como debería ser) y lo que hay en realidad son muy a menudo cosas DIFERENTES. Lo que se puede aconsejar: "Imprime previamente toda la secuencia de ejecución de tu código", es la forma más rápida de encontrar un error (o de asegurarte de que estás en lo cierto). :)
 
yan720:

Has escrito una respuesta de tres párrafos. En el primero te equivocaste (mi entrada es bastante correcta), en el segundo también te equivocaste (aunque este mensaje lo niveló :) El tercer punto sonó como si hubieras sugerido mover el cursor al final después de la entrada, no antes (lo que se tomó como un error de nuevo). Ante tal panorama, he preferido hacer una aclaración al moderador polivalente que responde.

No obstante, gracias por su respuesta. ¡Y feliz año nuevo! :)



:D ok, feliz año nuevo para ti también :)
 
Volviendo a lo escrito en la página 411 ... ¿alguien tiene idea de cómo combinar ese código y las condiciones de entrada/salida para cruzar dos MAs? o ¿las órdenes pendientes son la única opción?
 
petya33r:
Volviendo a lo escrito en la página 411 ... ¿alguien tiene idea de cómo combinar ese código y las condiciones de entrada/salida para cruzar dos MAs? o ¿las órdenes pendientes son la única opción?

Después de abrir una operación en una señal mooving, empezar a controlar el número de órdenes o este orden específicamente, si el número de órdenes para disminuir o como la segunda opción se cierra específicamente este orden, a continuación, averiguar cómo se cerró, si una parada, a continuación, abre sólo la orden opuesta en el precio actual, eso es todo
 
Ekburg:

Después de abrir un acuerdo sobre una señal de movimiento de empezar a controlar el número de órdenes o este orden específicamente, si el número de órdenes para disminuir o como la segunda opción se cierra específicamente este orden, a continuación, averiguar cómo se cierra, si la parada, a continuación, sólo tiene que abrir la orden opuesta en el precio actual, eso es todo

Lo entiendo, pero no puedo escribirlo. El Asesor Experto sólo opera con señales de muwings y no abre una posición inversa en caso de pérdida, o simplemente bloquea el terminal cuando comienza la prueba. Así que escribí algo que no puede ser procesado en absoluto. No soy muy bueno escribiendo. Necesito ayuda en forma de código escrito.

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

Si OrderProfit()<0, abrirá la ordencontraria. Pero no funciona junto con las señales de las ayudas en movimiento. ¿Puedes escribir un único código que proporcione tanto las señales de muwings como las condiciones para abrir una posición contraria?

Razón de la queja: