Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1228

 
Alexey Belyakov:

Mételo. No lo hice. Se abre en paquetes. La magia - la ignora.



Cuando escribas código, traduce su lógica al ruso. Al principio, hay un ciclo en el que se hacen comparaciones y si la orden seleccionada no es una orden de mercado, entonces a la siguiente iteración; si el símbolo no es EURUSD, entonces a la siguiente iteración y si el magik no es igual a su magik, entonces a la siguiente iteración. Al final del ciclo se cuenta el número de iteraciones que han pasado antes del final del ciclo. El ciclo termina y el programa comienza a abrir órdenes según las condiciones. Considerando que una de las condiciones es siempre cierta, se abre una orden. Y esto ocurre en cada tic.

 
Valeriy Yastremskiy:

Cuando escribas el código, traduce su lógica al ruso. Primero tiene un ciclo en el que se hacen comparaciones; si la orden seleccionada no es una orden de mercado, entonces a la siguiente iteración; si el instrumento no es el Eurobucks, entonces a la siguiente iteración; y si el magik no es igual a su magik, entonces a la siguiente iteración. Al final del ciclo se cuenta el número de iteraciones que han pasado antes del final del ciclo. El ciclo termina y el programa comienza a abrir órdenes según las condiciones. Considerando que una de las condiciones es siempre cierta, se abre una orden. Y esto ocurre en cada tic.

Ya veo. Pero en este caso, if(OrderMagicNumber() == MagicNumber)continue, la orden que ha sido colocada es aceptada por una orden colocada por Magic(o). Esto significa que la orden colocada manualmente en EUROBAX debe ser ignorada y una orden más debe ser abierta por un Asesor Experto con Magic.

OrdersTotal() - este es el problema que pone fin a cualquier manipulación con Magic.
 
Alexey Belyakov:

Lo entiendo. Pero en este caso: if(OrderMagicNumber() == MagicNumber)continue; Se toman las órdenes que se colocan por Magic(s). Es decir, una orden colocada manualmente en Eurobucks debe ser ignorada, y otra debe ser abierta por un EA con Magic.

OrdersTotal() - esta es la infestación que pone fin a cualquier manipulación del mago.

El código se ejecuta de arriba a abajo. Después del bucle se tiene la colocación de los pedidos. if(OrderMagicNumber() == MagicNumber)continue; Esto interrumpirá la ejecución del cuerpo del bucle y comenzará una nueva iteración del mismo. El bucle terminará y se iniciará la colocación de pedidos. Así es como lo has escrito. El número total de pedidos no tiene nada que ver con esto. Si desea hacer una condición que si no hay órdenes colocadas con su magik e instrumento, entonces el Código de colocación de órdenes debe ser diferente.

Recorrer los números de pedido. Si se encuentra una orden con nuestro magik y en nuestro instrumento, entonces vuelve - sale del inicio. O una bandera que su orden está allí y en el inicio ontik o empezar a comprobar en la bandera.

Y es mejor crear un EA a partir de una plantilla para crear un script de EA, un indicador. Los campos del código principal serán más correctos.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
          

             
if ((Close[0]>High[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1])&&(n==0))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}
 
Valeriy Yastremskiy:

El código se ejecuta de arriba a abajo. en un bucle según las reglas del mismo. Después del bucle tiene la colocación de órdenes. if(OrderMagicNumber() == MagicNumber)continue; Esto interrumpirá la ejecución del cuerpo del bucle y comenzará una nueva iteración del mismo. El bucle terminará y se iniciará la colocación de pedidos. Así es como lo has escrito. El número total de pedidos no tiene nada que ver con esto. Si quiere hacer una condición que si no hay órdenes colocadas con su magik e instrumento, entonces el Código de colocación de órdenes debe ser diferente.

Recorrer los números de pedido. Si se encuentra una orden con nuestro magik y en nuestro instrumento, entonces retorna - sale del inicio. O una bandera que su orden está allí y en el inicio ontik o empezar a comprobar en la bandera.

Y es mejor crear un EA a partir de una plantilla para crear un script de EA, un indicador. Los campos del código principal serán más correctos.

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Supongo que esta no es la solución, pero ¿en qué dirección trabajar?

He probado un par de docenas de variantes. O abre una orden, o sin ninguna interrupción, tuyvukuchu.

Aquí, por cierto, sobre OrderSekect - una variable de tipo bool debe establecerse, de lo contrario jurará.

 
Alexey Belyakov:

Esto no es una solución, pero ¿qué camino tomar?

Ya he probado un par de docenas de variantes. O bien abre una sola orden, o bien se abre sin ninguna interrupción.

Aquí, por cierto, sobre OrderSekect - una variable de tipo bool debe establecerse, de lo contrario jurará.

Sí, debería, vuelve a la nada.

for(int i = OrdersTotal(); i >= 0; i--) 
{
     bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Será mejor que escriba el algoritmo, que es lo que quiere hacer.

 
Alexey Belyakov:

Esto no es una solución, pero ¿en qué dirección debo trabajar?

Ya he probado un par de docenas de variantes. O bien abre una sola orden, o bien se abre sin ninguna interrupción.

Aquí, por cierto, sobre OrderSekect - una variable de tipo bool debe establecerse, de lo contrario jurará.

En lugar de return(0), el significado debería ser continue

 

¡Gente buena y bien informada! Ayuda para implementar el indicador Envelopes en un EA de MT5. El propio EA tiene que procesar cada tick (sin saltarse). He probado algunas variantes, he mirado en la documentación, parece que me gusta la variante, pero es para el manejador OnCalculate. Todavía no lo he probado con la biblioteca estándar... Bueno, aquí está mi implementación inicial:

input int       Indicatorperiod         = 3;
input double    EnvelopesDeviation      = 0.07;
int    handle;                                          //--- переменная для хранения хэндла индикатора iEnvelopes
double upperEnv[3], lowerEnv[3];                        // динамические массивы для хранения численных значений Emvelopes
double local_envelopesupper, local_envelopeslower;      // в эти переменные пытаюсь получить значения верхней и нижней линии индикатора
...

int OnInit()
...
handle=iEnvelopes(_Symbol,_Period,Indicatorperiod,0,MODE_LWMA,PRICE_OPEN,EnvelopesDeviation);
...

void OnTick()
...
//--- Объявляем структуру, которая будут использоваться
   MqlRates mrate[3];           // Будет содержать цены, объемы и спред для каждого бара
   ArraySetAsSeries(mrate, true); 

      //--- Получить исторические данные последних 3-х баров
      if(CopyRates(_Symbol,_Period,0,3,mrate)!=3)
        {
         Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
         return;
        }

      //--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивы
      if(CopyBuffer(handle,0,0,3,upperEnv)<2 || CopyBuffer(handle,1,0,3,lowerEnv)<2)
        {
         Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");
         return;
        }
...
local_envelopesupper = upperEnv[1];
local_envelopeslower = lowerEnv[1];
...

En el probador visual me sale:


¿Puede decirme qué es lo que falla y cuál es la mejor manera de hacerlo?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Некорректное отображение индикатора
 
Valeriy Yastremskiy:

Sí, se supone que jura, vuelve a la nada.

Será mejor que escribas el algoritmo que quieres hacer, no está claro lo que necesitas.

En el primer mensaje está el código. Es fácil: rompemos el máximo/mínimo anterior y abrimos una operación. Las órdenes abiertas por este EA no deben cruzarse con otras órdenes abiertas manualmente o por otro EA, es decir, el EA debe trabajar de forma independiente.

He buscado por todo Internet. Es un tema bastante trivial, pero hay muchas variaciones. Parece que es algo sencillo, y no se encuentra en ninguna parte.

 
Alexey Belyakov:

En el primer mensaje, el código. Es sencillo: romper el máximo/bajo anterior - abrir una operación. Las órdenes abiertas por este EA no deben solaparse con otras órdenes abiertas manualmente, o con las abiertas por otro EA, es decir, el EA debe trabajar de forma independiente.

He buscado por todo Internet. Es un tema bastante trivial, pero hay muchas variaciones. Parece que es algo sencillo, y no se encuentra en ninguna parte.

Describe el trabajo del Asesor Experto en su totalidad paso a paso. El primer paso es comprobar si hay órdenes con nuestro magik en el símbolo seleccionado. Si los tenemos, entonces terminamos el trabajo y si no los tenemos, entonces establecemos las órdenes. ¿Qué ocurre después de realizar los pedidos? Dice así
 
Maxim Kuznetsov:

en lugar de return(0) el significado debería ser continue

Ahí si hay igualdades, para no ir más lejos y terminar... No me gusta si no es igual entonces sigue. Es más difícil de entender.