Preguntas y respuestas a los programadores sobre MQL 4 - página 4

 

Hasta ahora, así:

//+------------------------------------------------------------------+

//| Fibo trading.mq4 ||

//| Minodi |

//| minodi@yandex.ru |

//+------------------------------------------------------------------+

#property copyright "Minodi"

#enlace de propiedad "minodi@yandex.ru"


extern int periodo_EMA = 233,

period_SMA = 233,

stoploss = 30,

extern double Lote = 0,01;

extern string SesEnd ="22:00"; //hora límite para Hai o Low

//+------------------------------------------------------------------+

//| función de inicio del programa de script |

//+------------------------------------------------------------------+

int inicio()

{

//------- Precios diarios, Fibs y Hi-Low rendering time--------------+

int shift = iBarShift(NULL,1440,Time[0]) + 1;

double HiPrice = iHigh(NULL,1440,shift); //Precio alto

double LoPrice = iLow(NULL,1440,shift); // precio bajo

double OpPrice = iOpen (NULL,1440,shift); //precio de apertura

double ClPrice = iClose (NULL,1440,shift); // Precio de cierre

datetime StTime = iTime(NULL,1440,shift); // ?

if(TimeDayOfWeek(StTime)==0/*Sunday*/)

{/ Agregar los viernes de alta y baja

HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));

LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));

OpPrice = iOpen(NULL,1440,shift+1);

ClPrice = iClose (NULL,1440,shift+1);

}

double Pivot =(HiPrice+LoPrice+ClPrice)/3;

doble Rango =Precio Alto-Precio Bajo;

doble Fibo138 =1,382*Rango+LoPrecio;

double Fibo162 =1,618*Rango+LoPrice;

double Fibo_138 =LoPrice-(1.382*Range-Range);

double Fibo_162 =LoPrice-(1,618*Rango-Rango);

//---------------- HiTime y Low-----------------------------------------+

int HiTime,LoTime;

int time; // en la siguiente barra se lanzan los valores


if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}

if (High[0]>HiPrice)HiTime=TimeCurrent();

if (Low[0]<LoPrice)LoTime=TimeCurrent();


Comment("En esta barra: "+"\Npunto alto de tiempo="+HiTime+"\Npunto bajo de tiempo="+LoTime);

//-----------------Ценовой диапазон Демарка-------------------------------+

int currDay, i=0; //

if (currDay!=TimeDay(Time[i]))

{

if (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;

si (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;

si (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;

i++;

}

double MaxDay = x - LoPrice; // Demark rango de precios

double MinDay = x - HiPrice; // Demark rango de precios

// -----------Скользящие средние---------------------------------------------+

double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);

double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);

double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

//----------------Удаление вчерашних ордеров---------------------------------+

//------------------Ордера----------------------------------------------------+

 

Estimados miembros del foro, comprueben el código, pienso añadir gradualmente

 

Estos son los parámetros que te he dado, colócalos antes de empezar


int HiTime,LoTime;

int time; // на следующем баре обнкляем значения

 
¡Hola, queridos programadores! ¿Puede aconsejar a un novato cómo escribir, si es posible, un script (no un Asesor Experto) que coloque una orden de comercio y al mismo tiempo habilitar el Trailing Stop en un nivel mínimo. Tal vez haya uno ya hecho, entonces si me puedes dar un enlace.
 
Vladon >>:

Вот эти параметры ято я давал, поместите перд стартом


int HiTime,LoTime;

int time; // на следующем баре обнкляем значения


Mover. ¿Todo lo demás está bien?
 

Estimados miembros del foro, por favor, presten atención y dígannos qué errores se han cometido:

//+------------------------------------------------------------------+

//| Fibo trading.mq4 ||

//| Minodi |

//| minodi@yandex.ru |

//+------------------------------------------------------------------+

#property copyright "Minodi"

#enlace de propiedad "minodi@yandex.ru"


extern int periodo_EMA = 233,

period_SMA = 233,

stoploss = 30,

Magia = 55;

extern double Lote = 0,01;

extern string SesEnd ="22:00"; //hora límite para Hai o Low


int HiTime,LoTime;

int time; // en la siguiente barra enrollar los valores


//+------------------------------------------------------------------+

//| función de inicio del programa de script |

//+------------------------------------------------------------------+

int inicio()

{

//------- Precios diarios, Fibs y High-Low rendering time--------------+

int shift = iBarShift(NULL,1440,Time[0]) + 1;

double HiPrice = iHigh(NULL,1440,shift); //Precio alto

double LoPrice = iLow(NULL,1440,shift); // precio bajo

double OpPrice = iOpen (NULL,1440,shift); //precio de apertura

double ClPrice = iClose (NULL,1440,shift); // Precio de cierre

datetime StTime = iTime(NULL,1440,shift); // ?

if(TimeDayOfWeek(StTime)==0/*Sunday*/)

{/ Agregar los viernes de alta y baja

HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));

LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));

OpPrice = iOpen(NULL,1440,shift+1);

ClPrice = iClose (NULL,1440,shift+1);

}

double Pivot =(HiPrice+LoPrice+ClPrice)/3;

doble Rango =Precio Alto-Precio Bajo;

double Fibo138 =1,382*Rango;

double Fibo162 =1,618*Rango;

double Fibo_138 =(LoPrice-1.382*Range)-Range;

double Fibo_162 =(LoPrice-1.618*Range)-Range;

//---------------- tiempo hai y baja-----------------------------------------+


if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}

if (High[0]>HiPrice)HiTime=TimeCurrent();

if (Low[0]<LoPrice)LoTime=TimeCurrent();


Comment("En esta barra: "+"\Npunto alto de tiempo="+HiTime+"\Npunto bajo de tiempo="+LoTime);

//-----------------Ценовой диапазон Демарка-------------------------------+

int currDay, i=0; //

if (currDay!=TimeDay(Time[i]))

{

if (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;

si (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;

si (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;

i++;

}

double MaxDay = x - LoPrice; // Demark rango de precios

double MinDay = x - HiPrice; // Demark rango de precios

// -----------Скользящие средние---------------------------------------------+

double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);

double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);

double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

//------------------Ордера----------------------------------------------------+

si (HiTime>LoTime){

int ticket1 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,Pivot,NULL,Magic,58000,Red);

int ticket2 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket3 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket4 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket5 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket6 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,Pivot,NULL,Magic,58000,Red);

}

si (HiTime<LoTime){

int ticket7=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,Pivot,NULL,Magic,58000,Red);

int ticket8=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket9=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket10=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,Pivot,NULL,Magic,58000,Red);

int ticket11=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket12=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,Pivot,NULL,Magic,58000,Red);

}

if (HiTime>LoTime && ClPrice>Pivot) {

int ticket13=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket14=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,Fibo138,NULL,Magic,58000,Red);

}

if (HiTime<LoTime && ClPrice<Pivot)

int ticket15=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket16=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,Fibo_138,NULL,Magic,58000,Red);

}

return(0);


//+------------------------------------------------------------------+


 

a primera vista los parámetros:

int currDay;


para empezar

 
Me olvidé de los topes, los puse a 30p
 
Señala los errores, quiero que el código funcione
 

Señores del foro, ayuden a entender....

Aquí está una parte del código (el código principal está tomado del manual de construcción del Asesor Experto)

// Función de la orden
// Variables globales:
// Mas_Ord_New[31][9] // Array de las últimas órdenes conocidas
// Mas_Ord_Old[31][9] // Array de las órdenes anteriores (antiguas)
// 1er índice = número de orden
// [][0] no está definido
// [][1] precio de la orden abierta (abs. de una orden (tasa abc)
// [][2] StopLoss de una orden (tasa abc)
// [][3] TakeProfit de una orden (tasa abc)
// [][4] Número de orden
// [][5] Número de lotes de una orden. (Tarifa Abc)
// [][6] Tipo de pedido 0=B,1=S,2=BL,3=SL,4=BS,5=SS
// [][7] número mágico de la orden
// [][8] 0/1

if (Mas_Ord_Old[old][6]==0 && Bid>Mas_Ord_Old[old][2] && Bid<Mas_Ord_Old[old][3])
Inform(1, Mas_Ord_Old[old][4]); // Así que la orden de compra fue cerrada por la señal del contador
else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa que SL ha disparado
else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]) // TA activado

else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3])
Inform(2, Mas_Ord_Old[old][4]); // Así que la orden de venta está cerrada por la señal del contador
else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa que SL ha disparado
else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TA disparó

El resto no tiene interés...

El problema: En el 90% de los casos se muestra el parámetro correcto, es decir, si se activa el SL, el parámetro es "19", si el TP es "20", si la orden se cierra manualmente, o por una señal de contador, el parámetro es "1" o "2". Fue diseñado así.

Pero a veces (bastante a menudo) en lugar de "20" devuelve "19" (o viceversa), o incluso "1"("2"). Por favor, ayúdeme a describir correctamente la función "if": como condiciones de cierre de la orden razones.

Creo que la razón puede estar en el redondeo de los precios?