¡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.
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?
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
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; // на следующем баре обнкляем значения
Вот эти параметры ято я давал, поместите перд стартом
int HiTime,LoTime;
int time; // на следующем баре обнкляем значения
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
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?