Da mesma forma que parecia, serão acrescentados apenas mais alguns parênteses encaracolados:
Eu corrigi, compilei, testei - o problema permanece - Quando uma determinada condição é atingida, o Consultor Especialista abre uma profissão e a fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.
Aqui está o código na íntegra.
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;
}
Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.
Aqui está o código na íntegra.
Onde isso conta?
bs+ss+bsts+ssts+blms+slms
Eles são globais. E eles não parecem ser reinicializados até que sejam verificados. E seus cálculos antes do cheque - onde?
Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.
Aqui está o código na íntegra.
BU refazê-lo, você não pode apagar posições de mercado, e por causa de uma parada congelada não haverá mais posições ))))
Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para abrir negócios estarem preenchidas.
Fonte
Por que contar as ordens pendentes? E quem é BU();?
Um método estranho de "separar" as posições de uma pessoa das de outras, não seria melhor
Por que contar as ordens pendentes? E quem é BU();?
É um método estranho para "separar" as próprias posições dos outros, não é melhor
BU(); é uma função de Breakeven.
O que há de errado com minha versão?
сюда пересчёт рыночных позиций и отложекComo seria no meu caso?Como seria no meu caso?
Da mesma forma que parecia, apenas mais um par de aparelhos encaracolados:
Da mesma forma que parecia, serão acrescentados apenas mais alguns parênteses encaracolados:
Eu corrigi, compilei, testei - o problema permanece - Quando uma determinada condição é atingida, o Consultor Especialista abre uma profissão e a fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.
Aqui está o código na íntegra.
Sobre o bem - isso é uma forquilha na água. Se é rápido, também é um pouco esticado... E se for barato, veja o ponto 1.
Então, é assim:
1. Bom é um pouco de pau na lama. 2.sobre rápido, é também uma espada de dois gumes... 3. E se for barato - veja o ponto 1.
Agora eu vejo!
Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.
Aqui está o código na íntegra.
Onde isso conta?
Eles são globais. E eles não parecem ser reinicializados até que sejam verificados. E seus cálculos antes do cheque - onde?Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para a abertura de negócios estarem preenchidas.
Aqui está o código na íntegra.
Fixo, compilado, testado - o problema permanece - Quando uma determinada condição ocorre, o Expert Advisor abre um negócio e o fecha no Take or Stop Loss. Neste ponto, o Consultor Especialista não abre mais negócios, apesar de as condições para abrir negócios estarem preenchidas.
Aqui está o código na íntegra.
BU refazê-lo, você não pode apagar posições de mercado, e por causa de uma parada de pendurar não haverá mais posições ))
))
Deixe os gurus comentarem se a função BU() precisa ou não ser quebrada (comentada), e deixe o alexey1979621 pensar, se esta função é chamada lá?
Também, se CountTrades(); função é usada assim, é igual a OrderTotal(), mais simples e mais rápido.