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

 
iMAG:

¡Estimados profesionales y conocedores!

Estoy perdido: el indicador BB me da señales incomprensibles (¡no "Rojo-Verde-Rojo"!). Para ser más precisos, he establecido esa llamada:

bolup = iBands(Symbol(), 0, 24, 0, 2, 0, 1, 1);
boln = iBands(Symbol(), 0, 24, 0, 2, 0, 2, 1);
bolmd = (bolup + boldn) / 2;
Print("Bandas superiores = ", bolup;)
Print("Bandas inferiores = ", boldn);
Print("Bandas de medios = ", bolmd);

El resultado es que las 3 variables dan el mismo valor. >8-O

Par EUR, TF - H1. ¿Alguna idea?

Gracias de antemano...

¿También pondrías la desviación en negativo?
 
Fantar:

para mayor claridad, he intentado hacer un dibujo en

Ahora intenta hacer lo mismo en mq4. Aquí hay una rama para preguntas, si algo no está claro. Existe el servicio Work para crear EAs desde cero
 
iMAG:

¡Estimados profesionales y conocedores!

Estoy perdido: el indicador BB me da señales incomprensibles (¡no "Rojo-Verde-Rojo"!). Para ser más preciso, voy a dar la siguiente llamada:

bolup = iBands(Symbol(), 0, 24, 0, 2, 0, 1, 1);
boldn = iBands(Symbol(), 0, 24, 0, 2, 0, 2, 1);
bolmd = (bolup + boldn) / 2;
Print("Bands upper = ", bolup);
Print("Bands lower = ", boldn);
Print("Bands media = ", bolmd);

Como resultado, las 3 variables dan el mismo valor. >8-O

Es EUR, H1. ¿Alguna idea?

Gracias de antemano...

La desviación de la línea principal que se establece es 0 (cero). Debería ser superior a cero.
 

La esencia de la estrategia: Entrada por señal estocástica (5,14,3) salida también por estocástica pero con otro periodo (5,3,3). No entiendo cómo hacer una salida por estocástico y no por señal inversa.
Tengo un problema y no tengo ni idea de cómo se puede solucionar, voy a intentar explicarlo.
Así, en el código que he publicado, hay 2 funciones
//+------------------------------------------------------------------+
//| подготовить массив тикетов для закрытия |
//+------------------------------------------------------------------+
void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9])
{
int size=ArrayRange(arrayTickets,0);
//----
if (size==0) return;

int i,type,ticket,closeSize;
for (i=0;i<size;i++)
{
type=arrayTickets[i][1];
// если тип ордера не рыночный, то пропускаем
if (type>OP_SELL) continue;

if (Revers) // перевернем тип рыночного ордера
{
if (type==OP_BUY) type=OP_SELL; else type=OP_BUY;
}

// тут решаем для каждого открытого ордера его судьбу
// оставить в рынке или добавить в массив на закрытие
if (type==OP_BUY)
{
//
// код разрешающий оставить покупку

// как пример
if (signal==OP_BUY) continue;
}

if (type==OP_SELL)
{
//
// код разрешающий оставить продажу

// как пример
if (signal==OP_SELL) continue;
}

closeSize=ArrayRange(ticketsClose,0);
ArrayResize(ticketsClose,closeSize+1);
ArrayResize(lots,closeSize+1);
ticketsClose[closeSize][0] = arrayTickets[i][0]; // # тикета
ticketsClose[closeSize][1] = arrayTickets[i][1]; // тип ордера

// здесь укажем сколько лотов нужно закрыть
lots[closeSize] = arrayTickets[i][2]; // закрываемый объем
// можно закрывать частично, тогда нужно переписать строку сверху
}
//----
return;
}

//+------------------------------------------------------------------+
//| Закрывает ордера с указанными тикетами |
//+------------------------------------------------------------------+
void CloseMarketOrders(int ticketsArray[][2], double lotsArray[])
{
//----
int i,size=ArrayRange(ticketsArray,0);
if (size==0) return;

int ticket,type;
double lots;
bool res;

int total=OrdersTotal();

for (i=0;i<size;i++)
{
ticket = ticketsArray[i][0];
type = ticketsArray[i][1];
lots = lotsArray[i];
RefreshRates(); // на всякий случай обновим сведения о рыночном окружении

// блок закрытия покупок
if (type==OP_BUY)
{
res = OrderClose(ticket,lots,Bid,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в покупку #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}

// блок закрытия продаж
if (type==OP_SELL)
{
res = OrderClose(ticket,lots,Ask,Slippage,Orange);
if (!res)
{
Print("Не удалось закрыть ордер в продажу #",ticket,"! Ошибка №",GetLastError());
// дальнейшая обработка ошибки, написать самостоятельно
}
}

}
//----
return;
}
En el void PrepareTicketsToClose(int signal, bool Revers, int & ticketsClose[][2], double & lots[],double arrayTickets[][9]) tenemos que poner una condición que decida si debemos dejar o cerrar la orden...
He intentado poner condiciones pero nada funciona....
¿Puede alguien mirar y mostrar si hay un error en estas funciones o me confundí....
Archivos adjuntos:
 
¿Puede decirme si tengo dos comandos OrderSend consecutivos estableciendo órdenes, necesito colocar la función IsTradeAllowed entre ellos?

¿o no es necesario y el EA pasará de la primera llamada OrderSend a la segunda sólo después de una orden colocada con éxito?

Si IsTradeAllowed sigue siendo necesario, ¿qué tiempo de espera debe establecerse en el bucle while?
 
Desead:
¿Puede decirme si tengo dos comandos OrderSend consecutivos estableciendo órdenes, necesito colocar la función IsTradeAllowed entre ellos?

¿o no es necesario y el EA pasará de la primera llamada OrderSend a la segunda sólo después de una orden colocada con éxito?

En el probador no es necesario, pero en la cuenta demo o real recibirá un mensaje sobre un hilo de comercio ocupado.

Desead:


Si IsTradeAllowed sigue siendo necesario, ¿qué tiempo de retardo debe establecerse en el bucle while?
Depende de la velocidad de ejecución, que es diferente para los distintos servidores. Recuerda también añadir una comprobación de bucle en IsStopped(), de lo contrario no tendrás suerte.
 
Hola, ¿podría decirme dónde puedo descargar el archivo de cotizaciones detalladas (tic o minuto)? Los datos que están en el archivo de cotizaciones en MT4 (no mucho) los datos de minutos sólo para 5 días de la prueba.
 

Buenas tardes. El sistema ofrece tres puntos de entrada para la COMPRA y la VENTA. Pero cuando llega una señal, se abren posiciones en cada tick mientras exista la señal. Hay un error en alguna parte con las banderas. Por favor, ayúdenme a entenderlo.

   static bool buy_h=true, buy_l=true, buy_50=true,
               sell_h=true, sell_l=true, sell_50=true;

 if(LSMA_Sig==0) // up-trend
    {
      if(Stoch_Sig==4 && buy_l==true)
       { 
         sl=Ask-Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_l=false; // снимем флаг
       }
      //---
      if(Stoch_Sig==0 && buy_50==true)
       {
         sl=Ask-Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_50=false;        
       }
      //---
      if(Stoch_Sig==2 && buy_h==true)
       {
         sl=Ask-Stop_Loss*Point;       
         Ans=OrderSend(Symb,OP_BUY,Lots,Ask,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
           Alert("Неудачная попытка открыть ордер BUY. Ошибка: ", GetLastError());
         if(Ans==true)
            buy_h=false;         
       }   
    }
   if(LSMA_Sig==1) // dn-trend
    {
      if(Stoch_Sig==3 && sell_h==true)
       {
         sl=Bid+Stop_Loss*Point;
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_h=false;
       }
     //---
     if(Stoch_Sig==1 && sell_50==true)
      {
         sl=Bid+Stop_Loss*Point;      
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_50=false;         
      }
     //---
     if(Stoch_Sig==5 && sell_l==true)
      {
         sl=Bid+Stop_Loss*Point;      
         Ans=OrderSend(Symb,OP_SELL,Lots,Bid,40,sl,0,"LSMA+Stoch",Magic);
         if(Ans==false)
            Alert("Неудачная попытка открыть ордер SELL. Ошибка: ", GetLastError());
         if(Ans==true)
            sell_l=false;        
      }
    }
    
   if(Stoch_Sig!=4 && buy_l==false) // поднимем флаг
       buy_l=true;
   if(Stoch_Sig!=0 && buy_50==false)
       buy_50=true;
   if(Stoch_Sig!=2 && buy_h==false)
       buy_h=true;
   if(Stoch_Sig!=3 && sell_h==false)
       sell_h=true;
   if(Stoch_Sig!=1 && sell_50==false)
       sell_50=true;
   if(Stoch_Sig!=5 && sell_l==false)
       sell_l=true;  
 
silhouette:

Buenas tardes. El sistema ofrece tres puntos de entrada para la COMPRA y la VENTA. Pero cuando llega una señal, se abren posiciones en cada tick mientras exista la señal. Hay un error en alguna parte con las banderas. Por favor, ayúdenme a entenderlo.

OrdersTotal() da el número de posiciones ya abiertas, es decir, podemos usarlo para comprobar si ya hay una posición abierta o no.

 
¿Hay alguna manera de saber las comisiones de una orden de 1 lote sin abrir una orden?