Lo mismo que parecía, sólo se añadirán un par de corchetes más:
Corregí, compilé, probé - el problema sigue siendo - Cuando se alcanza una determinada condición, el Asesor Experto abre una operación y la cierra en el Take o Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
externdouble Lots = 0.1;
externstring Сomment = "Pattern_1";
externint TakeProfit = 10;
externint StopLoss = 0;
externint Step = 2;
externint StepOtl = 4;
externint BULevel = 2;
externint NotBULevel = 2; // Уровень безубытка в пунктахexternint Slippage = 2; // проскальзывание externint Magic = 111;
int ticket1, ticket2, bs, ss, bsts, ssts, slms, blms;//добавил колич. ордеров по типам и их тикетыint timeprev;
double price1, price2; //цены открытия ордеров//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
double SL,TP;
int slv=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(Step<=slv || StepOtl<=slv) {Print("Step или StepOtl слишком мал"); return(0);}
CountTrades(); //подсчет ордеров по типам.
BU();
//если нет рыночных ордеров-----------------------------------------if(bs+ss+bsts+ssts+blms+slms==0)
{
if (Open[1]>Close[1] && Open[2]<Close[2] && High[1]>High[2] && Low[1]<Low[2]) // продажа
{
TP=NormalizeDouble(Bid - TakeProfit * Point, Digits);
SL=NormalizeDouble(Bid + StopLoss*Point,Digits);
if(TakeProfit==0) TP=0;
if(StopLoss==0) SL=0;
ticket1=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,"Pattern_1",Magic,0,Red);//Сразу с тейк-профитом, магик в настройкахif(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES)) price1=OrderOpenPrice();//цена первого ордера
SL=NormalizeDouble(Bid+StepOtl*Point-StopLoss*Point,Digits);
if(StopLoss==0) SL=0;
ticket2=OrderSend(Symbol(),OP_BUYSTOP,Lots,NormalizeDouble(Bid+StepOtl*Point,Digits),0,SL,0,"Pattern_1",Magic,0,Blue);//тикет для BuyStopif(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES)) price2=OrderOpenPrice();//цена второго ордера
}
if (Open[1]<Close[1] && Open[2]>Close[2] && High[1]>High[2] && Low[1]<Low[2]) // покупка
{
TP=NormalizeDouble(Ask + TakeProfit * Point, Digits);
if(TakeProfit==0) TP=0;
SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
if(StopLoss==0) SL=0;
ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,"Pattern_1",Magic,0,Blue);//с тейком, магик в настройках if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES)) price1=OrderOpenPrice();//цена первого ордера
SL=NormalizeDouble(Bid-StepOtl*Point+StopLoss*Point,Digits);
if(StopLoss==0) SL=0;
ticket2=OrderSend(Symbol(),OP_SELLSTOP,Lots,NormalizeDouble(Bid-StepOtl*Point,Digits),0,SL,0,"Pattern_1",Magic,0,Red);//тикет для SellStopif(OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES)) price2=OrderOpenPrice();//цена второго ордера
}
}
return(0);
}
//+------------------------------------------------------------------+void CountTrades() // количество открытых ордеров
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)//отделяем свои ордера. Магик задается в настройках
{
int typ=OrderType(); //однократный вызов функции ускоряет работуswitch (typ)
{
case0: bs++;
case1: ss++;
case2: blms++;
case3: slms++;
case4: bsts++;
case5: ssts++;
default: break;
}
}
}
}
return;
}
//+------------------------------------------------------------------+void BU()
{
for(int a=OrdersTotal()-1; a>=0; a--)
{
if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
int typ=OrderType(); //вызываем функцииint tic=OrderTicket(); //один разdouble oop=OrderOpenPrice(); //это ускоряет работуdouble otp=OrderTakeProfit(); //советникаdouble osl=OrderStopLoss();
if(typ==OP_BUY)
{
if(oop<=NormalizeDouble(Bid-BULevel*Point-NotBULevel*Point,Digits) && oop>osl)// последнеее условие БУ + 20 пипсов
OrderModify(tic,oop,NormalizeDouble(oop+NotBULevel*Point,Digits),otp,0,Green);
OrderDelete(ticket2,Yellow);
}
if(typ==OP_SELL)
{
if(oop>=NormalizeDouble(Ask+BULevel*Point+NotBULevel*Point,Digits) && (oop<osl || osl==0))// последнеее условие БУ + 20 пипсов
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NotBULevel*Point,OrderTakeProfit(),0,Red);
OrderDelete(ticket2,Yellow);
}
}
}
return;
}
Corregido, compilado, probado - el problema sigue siendo - Cuando se produce una determinada condición, el Asesor Experto abre una operación y la cierra en la Toma o el Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
¿Dónde cuenta?
bs+ss+bsts+ssts+blms+slms
Son globales. Y parece que no se reinician hasta que se revisan. Y su cálculo antes del cheque, ¿dónde?
Corregido, compilado, probado - el problema sigue siendo - Cuando se produce una determinada condición, el Asesor Experto abre una operación y la cierra en la Toma o el Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
BU rehacerlo, no se pueden borrar las posiciones de mercado, y debido a una parada congelada no habrá más posiciones ))))
Corregido, compilado, probado - el problema sigue siendo - Cuando se produce una determinada condición, el Asesor Experto abre una operación y la cierra en la Toma o el Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
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.
Fuente
¿Por qué contar las órdenes pendientes? ¿Y quién es BU();?
Extraño método para "separar" las posiciones propias de las ajenas, ¿no sería mejor
¿Por qué contar las órdenes pendientes? ¿Y quién es BU();?
Es un método extraño para "separar" las posiciones propias de las ajenas.
BU(); es una función de equilibrio.
¿Qué tiene de malo mi versión?
сюда пересчёт рыночных позиций и отложек¿Cómo sería en mi caso?¿Cómo sería en mi caso?
Lo mismo que parecía, sólo un par de llaves más añadidas:
Lo mismo que parecía, sólo se añadirán un par de corchetes más:
Corregí, compilé, probé - el problema sigue siendo - Cuando se alcanza una determinada condición, el Asesor Experto abre una operación y la cierra en el Take o Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
Sobre lo bueno - eso es una horquilla en el agua. Si es rápido, también es un poco exagerado... Y si es barato, véase el punto 1.
Entonces es así:
1. El bien es un poco de un palo en el barro. 2.Sobre la rapidez, también es un arma de doble filo... 3. Y si es barato, véase el punto 1.
¡Ahora lo veo!
Corregido, compilado, probado - el problema sigue siendo - Cuando se produce una determinada condición, el Asesor Experto abre una operación y la cierra en la Toma o el Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
¿Dónde cuenta?
Son globales. Y parece que no se reinician hasta que se revisan. Y su cálculo antes del cheque, ¿dónde?Corregido, compilado, probado - el problema sigue siendo - Cuando se produce una determinada condición, el Asesor Experto abre una operación y la cierra en la Toma o el Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
Corregido, compilado, probado - el problema sigue siendo - Cuando se produce una determinada condición, el Asesor Experto abre una operación y la cierra en la Toma o el Stop Loss. En este punto, el Asesor Experto no abre más operaciones, a pesar de que se cumplen las condiciones para abrirlas.
Aquí está el código completo.
BU rehacerlo, no se pueden borrar las posiciones de mercado, y debido a una parada colgante no habrá más posiciones )))
Que los gurús comenten si la función BU() necesita romperse (comentada) o no, y que alexey1979621 piense, si esta función se llama ahí?
Además, si se utiliza la función CountTrades(); así, es igual a OrdersTotal(), más sencillo y rápido.