Pregunta para los entendidos

 

Hola. Los expertos en programación pueden ayudar.

Asesor Experto: Comprar - cruce de estocásticos y la señal en la zona de sobreventa (por debajo de 25), bajo la condición de que

El pivote está por debajo del nivel de precios (una especie de soporte); por el contrario, el pivote está por encima del nivel de precios.

Las pruebas han mostrado algunos fallos de programación. 1) Cómo abrir sólo una operación por señal (durante las pruebas perdí todo, cuando la señal sigue activa (falsa), y la condición de cierre de la posición ya se ha producido). 2) si he puesto correctamente la condición de que el Pivot esté por encima/debajo del nivel de precios. Tengo dudas, viendo el gráfico de las pruebas.

Si puedo ayudar con ejemplos específicos. Conozco la programación a nivel de simple compilación !!!!!!!.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int inicio()
{
doble P_up0,P_down0,P_up1;
doble st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, total;

si(Bares<100)
{
Print("barras menos de 100");
return(0);
}
P_up0=iCustom(0,0, "Canal de precios",11,0,0);
P_down0=iCustom(0,0, "Canal de precios",11,1,0);
P_up1=iCustom(0,0, "Canal de precios",11,0,1);
P_down1=iCustom(0,0, "Canal de precios",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//poner todos los datos

total=Total de pedidos();
if(total<1)
{
// Comprobar el margen libre
if(AccountFreeMargin()<(1000*Lots))
{
Print("No tenemos dinero. Margen libre = ", AccountFreeMargin();
return(0);
}
// condición de apertura de la posición BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de compra abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden BUY : ",GetLastError());
return(0);
}
//condición de posición de venta abierta
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=Enviar orden(Símbolo(),OP_Venta,Lotes,Oferta,3,0,0,",0,0,Rojo);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de venta abierta : ",OrderOpenPrice())
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posición larga abierta
{
// condición de cierre de la posición larga
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
si no
{
// condición de cierre de la posición corta
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}




Archivos adjuntos:
pivot.mq4  2 kb
 
Kostay:

Hola. Los expertos en programación pueden ayudar.

Asesor Experto: Comprar - cruce de estocásticos y la señal en la zona de sobreventa (por debajo de 25), bajo la condición de que

El pivote está por debajo del nivel de precios (una especie de soporte); por el contrario, el pivote está por encima del nivel de precios.

Las pruebas han mostrado algunos fallos de programación. 1) Cómo abrir sólo una operación por señal (durante las pruebas perdí todo, cuando la señal sigue activa (falsa), y la condición de cierre de la posición ya se ha producido). 2) si he puesto correctamente la condición de que el Pivot esté por encima/debajo del nivel de precios. Tengo dudas, viendo el gráfico de las pruebas.

Si puedo ayudar con ejemplos específicos. Se me da bien programar a nivel de simple compilación !!!!!!!.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int inicio()
{
doble P_up0,P_down0,P_up1;
doble st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, total;

si(Bares<100)
{
Print("barras menos de 100");
return(0);
}
P_up0=iCustom(0,0, "Canal de precios",11,0,0);
P_down0=iCustom(0,0, "Canal de precios",11,1,0);
P_up1=iCustom(0,0, "Canal de precios",11,0,1);
P_down1=iCustom(0,0, "Canal de precios",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//poner todos los datos

total=Total de pedidos();
if(total<1)
{
// Comprobar el margen libre
if(AccountFreeMargin()<(1000*Lots))
{
Print("No tenemos dinero. Margen libre = ", AccountFreeMargin();
return(0);
}
// condición de apertura de la posición BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de compra abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden BUY : ",GetLastError());
return(0);
}
//condición de posición de venta abierta
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=Enviar orden(Símbolo(),OP_Venta,Lotes,Oferta,3,0,0,",0,0,Rojo);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de venta abierta : ",OrderOpenPrice())
}
else Print("Error al abrir la orden de VENTA : ",GetLastError());
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posición larga abierta
{
// condición de cierre de la posición larga
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
return(0);
}
}
si no
{
// condición de cierre de la posición corta
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}

1) cómo hacer que sólo se abra una operación con una señal

Lo necesito así:

if(total<1) 
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
         

if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Alert("Покупка: ",OrderOpenPrice());                      
           }
         else Alert("ошибка:по цене ",OrderOpenPrice()); 
         return(0); 
        }
        
        
     return(0);
     }
 
¡Perdí todo mi depósito en el mismo lugar!
 

Sigo sin entender qué he cambiado en este código. ¡Parece ser el mismo!

Y aún así, ¿cómo puedo programarlo para que abra sólo una posición por señal?

Y si una posición se cerró en la misma barra (es decir, la señal sigue activa), entonces no debería abrirse una nueva.

 
Kostay:

...Sin embargo, ¿cómo puedo programarlo para que abra sólo una posición por señal?

Y si se cerró una posición en la misma barra (es decir, la señal sigue activa), entonces no se debe abrir una nueva posición.

Si la hora de apertura de las órdenes, incluidas las cerradas, pertenece a la barra actual (en la que ha aparecido la señal), entonces estamos fumando en la valla.

Más o menos:

bool flag=true;
int cnt=OrdersTotal()-1;
for(int i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
if(!flag) return; 
 

¿Cómo puede haber más de un puesto abierto a la vez si esto está presente?

total=OrdersTotal();
if(total<1)

?
 

Insertado su código en el EA. pero el resultado es el mismo.

Debo haber insertado mal el marco. Por favor, revise.

extern double Lots = 0.1;
bool flag=true;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("barras menores de 100");
return(0);
}
P_up0=iCustom(0,0, "Price channel",11,0,0);
P_down0=iCustom(0,0, "Price channel",11,1,0);
P_up1=iCustom(0,0, "Price channel",11,0,1);
P_down1=iCustom(0,0, "Price channel",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0, "Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//poner todos los datos

total=OrdersTotal();
if(total<1)
{
// Comprobar el margen libre
if(AccountFreeMargin()<(1000*Lots))
{
Print("No tenemos dinero. Margen libre = ", AccountFreeMargin());
return(0);
}
// Condición de apertura de la posición BUY
if(st_m2>st_s2&st_m1>st_s1&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
¡Alert("Compra: ",OrderOpenPrice());
}
else Alert("error:precio ",OrderOpenPrice());
return(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Tiempo[0] - si la posición se abre en la barra cero del símbolo actual
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Tiempo[0] - si la posición se abre en la barra cero del símbolo actual
flag=false;
break;
}
¡}
if(!flag) return;
// Condición de apertura de posición de VENTA
if(st_m2<st_s2&st_m1<st_s1&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
¡Alert("Compra: ",OrderOpenPrice());
}
else Alert("error:precio ",OrderOpenPrice());
return(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderOpenTime()>=Time[0]) { // Tiempo[0] - si la posición se abre en la barra cero del símbolo actual
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
if(OrderOpenTime()>=Time[0]) { // Tiempo[0] - si la posición se abre en la barra cero del símbolo actual
flag=false;
break;
}
}
if(!flag) return;
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posición larga abierta
{
// condición para cerrar la posición larga
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)
return(0);
}
}
else
{
// condición de cierre de posición corta
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
}
return(0);
}




 
D500_Rised:

¿Cómo puede haber más de una posición abierta al mismo tiempo si esto está presente?

total=OrdersTotal();
if(total<1)

?

Usted ha entendido mal. no se abre más de 1 posición simultáneamente!!!!!!! señal apareció - posición abierta. en la misma barra cero el precio fue en la dirección opuesta y la condición de cerrar la posición es válida. se cierra, en consecuencia, en la misma barra cero. Pero la acción de la señal no se ha cancelado. la posición se abre y se cierra de nuevo, ya que va en la dirección opuesta.

Así que la pregunta es ¿cómo hacer que una señal abra sólo una posición, aunque se cierre con un nuevo tick?

 
Entonces tienes que hacer una prohibición en el comercio intrabarra ir a través de la búsqueda con estas palabras clave, lo encontrarás.
 
Kostay:

Insertado su código en el EA. pero el resultado es el mismo.

Debo haber insertado el código incorrectamente.

Por favor, pero la próxima vez pega el código a través del botón

No debería haber ningún error pero no lo he probado.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
      
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 

Lo extraño está pasando con el Asesor Experto ahora. no está funcionando con los cierres de posiciones. puede haber varias posiciones del mismo tipo abiertas y activas al mismo tiempo. Y el resultado: ¡todo pierde en el mismo problema, aunque en una versión modificada!

Razón de la queja: