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.
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.