Kilkukrotnie zadawałem pytania na forum, ale problem nie został rozwiązany.
Zaczęło się od tego, że EA czasami wogóle nie ustawiał SL i TP. Problem rozwiązał Tig3r i podał przykład otwierania transakcji z kilkukrotnym ponawianiem modyfikacji w razie niepowodzenia.
Wykorzystałem to w kodzie. Pomogło. Jednak jeśli EA chodzi na kilku parach jednocześnie to dzieją się dziwne rzeczy.
Na jednej parze walutowej modyfikuje SL z ceną innej pary !
Problem dotyczy tylko SL ( TP jes OK ). Dodam, że EA na każdej parze ma inny numer magic.
W kodzie są jeszcze funkcje TrailingStop i BE i prawdopodobnie to tam tkwi problem. Z tego co widzę EA przy otwieraniu pozycji ustawia SL i TP dobrze, ale przy działaniu funkcji BE lub TS pojawiają się takie rzeczy jak w załączniach. Poza tym ciągle wyświetla mi w dzienniku error1.
Proszę Was o pomoc, bo już tracę głowę. Jak dla mnie - wszystko jest OK.
Ale co jest nie tak w funkcji BE i TraillingStop ??
Jak to napisać poprawnie, aby działało na kilku parach i nie zaporzyczało sobie SL z innych par walutowych ?
Poniżej kod EA. Warunki otwarcia są przykładowe.
Kod: Zaznacz cały
#include <stdlib.mqh>
extern double lot = 0.1;
extern int TP = 10;
extern int SL = 10;
extern bool TrailingStop = false;
extern int ActivateTS = 10;
extern int StepTS = 10;
extern bool BE = false;
extern int BElev1 = 20;
extern int BEwyn1 = 0;
extern int MagicNumber = 891001;
double myPoint;
////////////////////////////////////////////////////////////////////////
void init()
{ myPoint = Point;
if (Digits == 3 || Digits == 5) myPoint = 10*Point;
}
///////////////////////////////////////////////////////////////////////
void deinit()
{}
///////////////////////////////////////////////////////////////////////
void start()
{ double MA = iMA(Symbol(),Period(),30,0,0,0,0);
//+--Trailing stop
if (total(OP_BUY )>0 && TrailingStop==true) ts(OP_BUY );
if (total(OP_SELL)>0 && TrailingStop==true) ts(OP_SELL);
//+--BE
if (total(OP_BUY )>0 && BE==true) be(OP_BUY );
if (total(OP_SELL)>0 && BE==true) be(OP_SELL);
//+--Transakcje--+//
if(total(OP_BUY)==0&&Bid>MA)
int ticketB=-1;
int ponowien = 10;
while(ticketB<0 && ponowien>0)
{ticketB=OrderSend(Symbol(),OP_BUY,lot,Ask,2,0,0,"",MagicNumber,0,Green);ponowien--;}
if(OrderSelect(ticketB,SELECT_BY_TICKET,MODE_TRADES))
{ponowien = 10;
while(ponowien>0 && !OrderModify(ticketB,OrderOpenPrice(),OrderOpenPrice()-SL*myPoint,OrderOpenPrice()+TP*myPoint,0,Green))
{ponowien--;
if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}
ponowien = 10;
while(ponowien>0 && !OrderModify(ticketB,OrderOpenPrice(),OrderOpenPrice()-SL*myPoint,OrderOpenPrice()+TP*myPoint,0,Green))
{ponowien--;
if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}}
if(total(OP_SELL)==0&&Bid<MA)
int ticketS=-1;
int ponowien1 = 10;
while(ticketS<0 && ponowien1>0)
{ticketS=OrderSend(Symbol(),OP_SELL,lot,Bid,2,0,0,"",MagicNumber,0,Red);ponowien1--;}
if(OrderSelect(ticketS,SELECT_BY_TICKET,MODE_TRADES))
{ponowien1 = 10;
while(ponowien1>0 && !OrderModify(ticketS,OrderOpenPrice(),OrderOpenPrice()+SL*myPoint,OrderOpenPrice()-TP*myPoint,0,Green))
{ponowien1--;
if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}
ponowien1 = 10;
while(ponowien1>0 && !OrderModify(ticketS,OrderOpenPrice(),OrderOpenPrice()+SL*myPoint,OrderOpenPrice()-TP*myPoint,0,Green))
{ponowien1--;
if(SL<=MarketInfo(Symbol(),MODE_STOPLEVEL)) SL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(TP<=MarketInfo(Symbol(),MODE_STOPLEVEL)) TP=MarketInfo(Symbol(),MODE_STOPLEVEL);}}
}
////////////////////////////////////////////////////////////////////////
int total(int cmd)
{int sum=0;
for(int i=0;i<=OrdersTotal();i++)
{OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol()&&cmd==OrderType()&&MagicNumber==OrderMagicNumber()) sum++;
}return(sum);}
////////////////////////////////////////////////////////////////////////
void ts(int cmd)
{
for (int i=0;i<=OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (Symbol()==OrderSymbol() && MagicNumber==OrderMagicNumber() && cmd==OrderType() && OrderStopLoss()!=0)
{
double sl = 0;
color cl;
if (OrderType()==OP_BUY)
{
if (Bid>=OrderOpenPrice()+ActivateTSmy*Point)
{
if (Bid-OrderStopLoss()>=(StepTS)*myPoint)
{
sl = Bid-StepTS*myPoint;
}
}
cl = Blue;
}
if (OrderType()==OP_SELL )
{
if (Ask<=OrderOpenPrice()-ActivateTS*myPoint)
{
if (OrderStopLoss()-Ask>=(StepTS)*myPoint)
{
sl = Ask+StepTS*myPoint;
}
}
cl = Red;
}
if (sl!=0)
{
int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,cl);
if (ticket<=0) Print(ErrorDescription(GetLastError()));
}
}
}
}
/////////////////////////////////////////////////////////////////
void be(int cmd)
{
for (int i=0;i<=OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (Symbol()==OrderSymbol() && MagicNumber==OrderMagicNumber() && cmd==OrderType() && OrderStopLoss()!=0)
{
double sl;
color cl;
if (OrderType()==OP_BUY)
{
if (Bid>=OrderOpenPrice()+(BElev1*myPoint)&&OrderStopLoss()<OrderOpenPrice())
{
sl = OrderOpenPrice()+(BEwyn1*myPoint);
cl = Blue;
}
}
}
if (OrderType()==OP_SELL )
{
if (Ask<=OrderOpenPrice()-(BElev1*myPoint)&&OrderStopLoss()>OrderOpenPrice())
{
sl = OrderOpenPrice()-(BEwyn1*myPoint);
cl = Red;
}
}
if (sl!=0)
{
int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,cl);
}
}
}