[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 497

 
sss2019:

Dime cómo escribir un EA en esta condición:

Hay tres pares de divisas en los que el EA abrirá operaciones y el EA está unido a un solo gráfico y en los otros dos funciona por sí mismo, en general, multidivisa.

La segunda condición es que cuando el precio alcanza un determinado nivel en cualquiera de los pares de divisas, se abre una operación. Sólo se puede abrir una operación a la vez.

Una vez cerrada la operación, el Asesor Experto puede reabrirla en cualquiera de los pares si el precio se aproxima.

He establecido una variable estática para que mientras el valor de la variable sea falso, se permita la apertura de las operaciones y en cuanto se abra la orden en cualquiera de los pares, la variable tome el valor verdadero. En cuanto se cierra la orden y el bucle for no encuentra ninguna operación, la variable vuelve a tomar el valor false.

Y si, por ejemplo, sólo se debe abrir una operación para cada uno de los pares, significa que cada par tiene su propia variable.

¿Existe una solución más racional para este problema?


Hay un parámetro como "Magik" en la orden - sólo cuenta las órdenes con un determinado magik y permite o prohíbe las operaciones.
 

¿Cómo se cierran los pedidos correctamente y cómo se recoge la información sobre ellos?

Perdón por las preguntas estúpidas de antemano) he escrito el siguiente algoritmo: quiero abrir una posición de compra cuando la apertura es menor que el fractal hacia arriba y el cierre es mayor que el fractal; también quiero cerrar una posición de venta cuando la apertura es mayor que el fractal hacia abajo y el cierre es menor; también quiero cerrar todas las posiciones si caen por debajo de 85 puntos o si la orden se ha abierto dentro de 38 velas (const. S).Me da la sensación de que no se cierra nada, sólo órdenes cerradas y en general me da la sensación de que estoy tratando las órdenes de forma incorrecta, opero mal y luego las cierro de forma incorrecta)) Por favor, díganme cómo cerrarlas correctamente, para que no se cuelen cerradas y dónde hay errores en este código. O puede ser un ejemplo de cómo caminar nyu, en el que todas estas operaciones se realizan adecuadamente. Gracias de antemano por su ayuda).


extern int S=38; //número de velas, tras las cuales se cerrará la posición
extern int SL=85; //el stop, al que se cerrarán las posiciones en cualquier caso
extern int HIGH=0; //en qué timeframe se buscarán los extremos (5 o 1 o 0(D1))
extern int l=1; //número de lotes a negociar
int massorder[30][30]; //hay datos sobre lotes ABIERTOS
int numb=1; //el número de el-ta en el array, que es oot. lote abierto
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0;

int inicio()

{
if(Hour()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}
//----
if(Open[1]<up && Close[1]>up)//si la vela es más baja en la apertura y más baja en el cierre que el nivel fractal arriba, entonces
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata();
}
if(Open[1]>down && Close[1]<down)//si la vela es más alta en la apertura y más baja en el cierre que el nivel fractal down, entonces
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i==S)
{
closeAllticket();
closeAllPos();
}
i++;
//----
x=Hora();
if(Hora()==23)
x=-1;
return(0);
}
//+------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}
}
void searchH1()//función para encontrar el fractal
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &&& iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5))
highH1=iHigh(Symbol(),PERIOD_H1,3)

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
return (0);

}

void savedata() //programa para guardar los datos en el array
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice();
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType()==OP_BUY)
massorder[numb][4]=0;
if(OrderType()==OP_SELL)
massorder[numb][4]=1;
numb++;

}
 
Qwertee:

¿Cómo se cierran los pedidos correctamente y cómo se recoge la información sobre ellos?

Perdón por las preguntas estúpidas de antemano) He escrito el siguiente algoritmo: quiero abrir una posición de compra cuando la apertura sea menor que el fractal alcista y el cierre sea mayor que el fractal alcista, y una posición de venta cuando la apertura sea mayor que el fractal bajista y el cierre sea menor; también quiero cerrar todas las posiciones si se quedan cortas en 85 puntos o si la orden se abre dentro de 38 velas (const. S).Me da la sensación de que no se cierra nada, sólo órdenes cerradas y en general me da la sensación de que estoy tratando las órdenes de forma incorrecta, opero mal y luego las cierro de forma incorrecta)) Por favor, díganme cómo cerrarlas correctamente, para que no se cuelen cerradas y dónde hay errores en este código. O puede ser un ejemplo de cómo caminar nyu, en el que todas estas operaciones se realizan adecuadamente. Gracias de antemano por su ayuda).


En las variables globales, en las que se han especificado topes al principio

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

antes de abrir los pedidos:

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

en la señal para abrir

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

al final de la EA

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

Supongo que no me olvidé de nada

 
belck:


en las variables globales, donde se han especificado los topes al principio

antes de que se abrieran los pedidos:

en la señal para abrir

al final de la EA

como si nada se hubiera olvidado



Puse todo lo que escribiste pero aún no ha cambiado nada por alguna razón. el resultado es el mismo que era y sigue siendo, las órdenes permanecen abiertas por una gran cantidad de tiempo, y necesito que se cierren después de las barras S, ¿qué es? ?????????????????

Archivos adjuntos:
ikdgna.mq4  7 kb
 
Qwertee:


Puse todo lo que escribiste pero aun no ha cambiado nada. el resultado es como era y como es ahora, las ordenes siguen abiertas mucho tiempo y necesito que se cierren después de las barras S, cual es el trato?????????????????

La llamada al cierre de las órdenes debe realizarse antes de la apertura de las mismas. Las tengo en cierre:

ante el más global

#include <stdlib.mqh>


Lo pongo así antes de abrir los pedidos:

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

y esto al final del EA

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

Pregunta a los expertos, ¿hay algún criterio para los EA, como el número mínimo de lotes para un determinado período de tiempo de la prueba? ¿Porcentaje de pérdida, etc.?

Sólo tengo 2 EAs, y hacen 100 operaciones al año, y otro hace 30 operaciones en total... (plazo 15, 30 respectivamente). La rentabilidad es buena, la primera está en una demo sobre cotizaciones reales, ahora se está probando... Pero puede alguien decirme si hay una mejor... Pero tal vez alguien me diga si hay mejores pruebas que en MT4?

 
¿Puede decirme cómo ejecutar una condición? Tenemos una condición para abrir una orden de compra al precio actual tan pronto como el precio alcance 1,2550. Así, cuando el precio es mayor o igual a 1,2550, se abre la orden y cuando se abre la orden, la variable estática bloquea la apertura de nuevas órdenes, hasta que la orden llega a 0. Así, en cuanto se cierra la orden y no hay más órdenes con esta magia, se elimina la prohibición de apertura y se abre una nueva orden, pero el precio ya se ha alejado de este nivel. Necesitamos que el Asesor Experto abra órdenes de mercado cuando el precio alcance este nivel, no las pendientes.
 

Hola a todos los conocedores))))

Hay un indicador que dibuja una línea de tendencia en los dos últimos fractales, pero la dibuja después de un "fractal no confirmado", es decir, la segunda barra aún no se ha formado después del fractal pero la línea ya se ha dibujado. ¿Cómo hacer que se dibuje después de la segunda barra pero no después de la primera? El indicador está en la ficha.

Archivos adjuntos:
 
rigc:

Hola a todos los conocedores))))

Hay un indicador que dibuja una línea de tendencia en los dos últimos fractales, pero la dibuja después de un "fractal no confirmado", es decir, la segunda barra aún no se ha formado después del fractal pero la línea ya se ha dibujado. ¿Cómo hacer que se dibuje después de la segunda barra pero no después de la primera? El indicador está en la ficha.


Prueba con
Archivos adjuntos:
 
Figar0:

Prueba con
no dibujar en absoluto)))
Razón de la queja: