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

 
drknn:

No entiendo que tengo una línea en la apertura de la orden de mercado, la copio y agrego una nueva a la Orden pero no funciona el mismo error 4107, si te interesa mira lo que me faltó

Archivos adjuntos:
test_21_1.mq4  15 kb
 
FoxUA:

No lo entiendo, tengo esta línea en la apertura de la orden de mercado, la copio en una orden pendiente y añado una nueva, pero sigue escribiéndose el mismo error 4107 en el registro, pero las órdenes pendientes se ponen, si os interesa mirad lo que me he perdido.


Tienes un código muy mal organizado. Y los nombres de las variables tienen abreviaturas que también dificultan su lectura.

El código debe estar organizado en bloques. Asigne nombres a las variables de forma que quede claro a simple vista de qué trata el código. Nombres constantes (acostúmbrate) escríbelos en mayúsculas. La inicialización de las constantes con valores debe colocarse en un bloque de inicialización. Así, por ejemplo, tienes un uso absolutamente injustificado de la cadena

string sy = Symbol();

al inicio de la EA. Bien, dime por qué en cada tick necesitas llamar a la función Symbol(), si durante toda la operación el nombre del símbolo permanece igual? Es suficiente con inicializar una vez con el valor de la variable sy en el bloque de inicialización, y eso es todo. Además, este bloque de código

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

Es un error fundamental. Para conocer el stop loss de la última orden, ésta (la orden) debe ser seleccionada primero mediante OrderSelect() - véase el ejemplo en el contador de órdenes más abajo. Esto significa que si necesita niveles de parada para las últimas órdenes, tendrá que hacerlo a través de un bucle. Siguiente. El diseño de

int total = OrdersTotal();
if(total == 0){

}

no está justificado. La función OrdersTotal() devolverá el número total de órdenes ya abiertas en el terminal. Este valor incluye las órdenes abiertas por otros instrumentos comerciales, así como las órdenes que no fueron abiertas por el Asesor Experto, sino por usted personalmente de forma manual para el mismo instrumento, que el Asesor Experto ha colocado.

Si no vas a operar a mano y sólo operas en el símbolo al que se ha lanzado el EA, entonces este diseño funcionará. Pero en cuanto quieras operar con las manos y que el EA no interfiera con tus operaciones manuales, o quieras que las operaciones se ejecuten también con otros símbolos, el diseño realmente te decepcionará. Así que es mejor escribir contadores de pedidos separados para cada tipo de pedido. He aquí un ejemplo de este tipo de contador.

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

Reescribir el código teniendo en cuenta las recomendaciones anteriores!!!

 

Lo siento, no me di cuenta de que las cadenas como

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

llamar a un subprograma.

Pero aún así es mejor organizarlo de otra manera.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

No es necesario pasar el nombre simbólico de un símbolo comercial al subprograma. Su subrutina está en el Asesor Experto, no en la biblioteca incluida. Dado que la variable sy se declara a nivel global del Asesor Experto, esta variable está en el ámbito de dichos subprogramas. Además, se pasa el segundo parámetro al subprograma, pero cuando se llama al propio subprograma, se inicializa este parámetro con un valor ( int op=-1) - no es necesario hacerlo. Lo mismo ocurre con el siguiente parámetro.

La línea

>> if (op<0 || OrderType()==op) {

de nuevo es ilegible. ¡Mira cómo está organizado en mi mostrador!

 

Y luego está esto. El bloque de código

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

se llama en cada tic. Pero no es necesario en todos los casos. En algunos casos sólo es necesario conocer la orden de stop/ganancia. Estos son los casos en los que necesitas llamar a tu subrutina.

 
spidey:

Hola, ¿podría adjuntar una alerta al indicador (el verde cruza el rojo de arriba a abajo - venta, atrás - compra)?

Bueno, alguien está publicando códigos robados en el foro de nuevo. :))))))))

Dudo que alguien quiera rebuscar en este batiburrillo de variables numeradas de forma gratuita :)

 
spidey:

Buenas tardes, ¿podríais añadir una alerta al pavo (el verde cruza el rojo de arriba a abajo - venta, atrás - compra)?

Si lo vuelves a hacer me veré obligado a expulsarte del juego.

Esto es una violación de las normas del foro.

 
¿se debe publicar el código?
 
drknn:

Lo siento, no me di cuenta de que las cadenas como

llamar a un subprograma.

Pero aún así es mejor organizarlo de otra manera.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

No es necesario pasar el nombre simbólico de un símbolo comercial al subprograma. Su subrutina está en el Asesor Experto, no en la biblioteca incluida. Dado que la variable sy se declara a nivel global del Asesor Experto, esta variable está en el ámbito de dichos subprogramas. Además, se pasa el segundo parámetro al subprograma, pero cuando se llama al propio subprograma, se inicializa este parámetro con un valor ( int op=-1) - no es necesario hacerlo. Lo mismo ocurre con el siguiente parámetro.

La línea

>> if (op<0 || OrderType()==op) {

de nuevo es ilegible. ¡Mira cómo está organizado en mi mostrador!

Así que supongo que la llamada a la función se puede escribir simplemente

PrAskLim = StopLossLastPos(OP_SELL); en la propia función

double StopLossLastPos(int op=-1,) así?

Ya conté que tomé las funciones de este sitio, su trabajo ha sido probado porque no me atrevo a cambiar sus variables por otras más legibles, ya que me puede faltar experiencia en lo que se puede y lo que no se puede cambiar; esto está plagado del peligro de que cambie algo mal en una función que funciona y se vuelva a meter en un montón de código,

pero he arreglado todo lo que he podido lo que he añadido yo mismo,

Ya los añadí yo mismo pero no me solucionó mis problemas con el registro 4107 y tengo que preguntar cómo puedo cambiar el precio y los stops porque no cambié nada fundamentalmente en la función de órdenes pendientes.

La segunda cuestión es cómo añadir un spread a este precio PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

Esta es la versión modificada del EA

Archivos adjuntos:
test_21_2.mq4  16 kb
 
spidey:
¿se debe publicar el código?
No hace falta que publiques el material robado.
 
drknn:
No tienes que publicar cosas robadas.

No tienes que robar.

Y las normas de este recurso no lo prohíben...

https://www.mql5.com/ru/code/8089

;)