Mam problem ze skryptem na MT4, napisałem n.p.d.m(na podstawie dostępnych mi materiałów) skrypt który ma zadanie:
Wykryć pojedynczą tranzakcie na moim rachunku za pomocą EA (zulutrade) i w zależności od typu zlecenia ma założyć zlecenia oczekujące, w przypadku gdy EA zamknie swoją tranzakcie skrypt również wszystkie zlecenia zamyka.
Czy ktoś za darmo podjął się poprawienia skryptu?
Skrypt ma parę błędów które nie mogę rozwiązać (tak jakby uruchamiał się podwójnie, czasami się zacina , czasami wariuje).
Po uruchomieniu (pierwsze zamkniecie skryptu) poprawia jego działanie (stabilność - skrypt się nie zamyka) - drugie zamknięcie zamyka skrypt (lekkie przewieszenie prawdopodobnie przez pętle (while). Mimo wszystko potrafi się zawiesić lub sam zamykać zlecenia bez wyraźnej przyczyny.
Dodano po 8 minutach:
Skrypt składa się między innymi z elementów kodu ogólnie dostępnego bardziej lub mniej zmodyfikowanego zamkniętego w funkcje (wstawianie zleceń oczekujących, zamykanie wszystkich zleceń)
Kod: Zaznacz cały
int TimeInterval=1; //----pętla czasu 1 - on, 0 - off
string NameTradeMaster;
int start()
{
MainProgram();
return(0);
}
//+------------------------------------------------------------------+
void MainProgram()
{
Print(AccountNumber());
if (AccountNumber()==5128601)
{
while(TimeInterval>0) //----- petla czasu
{
int cmd,total;
total=OrdersTotal();
bool NTM = false;
//point=MarketInfo(Symbol(),MODE_POINT);
for(int i=0; i<total; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
Print("Tutaj komentarz:",OrderComment());
Print(total);
//-----IF sprawdza czy master ma otwartą pozycja
if (OrderComment()!="" && OrderComment()!="p")
{
NameTradeMaster=OrderComment();
Print(NameTradeMaster);
}
//-----IF otwieranie pozycji
if (OrderComment()!="" && OrderComment()!="p" && total == 1)
{
cmd=OrderType();
//---- buy or sell orders are considered
if(cmd==OP_BUY)
{
OpBuyLimit(10,"",0.01);
OpBuyLimit(11,"",0.01);
OpBuyLimit(12,"",0.01);
OpBuyLimit(13,"",0.01);
OpBuyLimit(14,"",0.01);
OpBuyLimit(15,"",0.01);
OpBuyLimit(16,"",0.01);
OpBuyLimit(17,"",0.01);
OpBuyLimit(18,"",0.01);
OpBuyLimit(19,"",0.01);
}
if(cmd==OP_SELL)
{
OpSellLimit(10,"",0.01);
OpSellLimit(11,"",0.01);
OpSellLimit(12,"",0.01);
OpSellLimit(13,"",0.01);
OpSellLimit(14,"",0.01);
OpSellLimit(15,"",0.01);
OpSellLimit(16,"",0.01);
OpSellLimit(17,"",0.01);
OpSellLimit(18,"",0.01);
OpSellLimit(19,"",0.01);
}
}
//-----IF zamykanie pozycji
if (NameTradeMaster==OrderComment())
{
NTM = true;
Print(NTM);
}
}
if (NTM == false)
{
CloseAllPositions();
}
Print("000000000000000000000000000000000");
Sleep(1000);
Print("000000000000000000000000000000000");
}//----pętla czasu
}//-----IF sprawdza rachunek
}
//MainProgram();
return(0);
}
void OpSellLimit(int pips, string text, double lots)
{
int ticket,expiration;
double point;
double typeorderm;
//----
point=MarketInfo(Symbol(),MODE_POINT);
expiration=CurTime()+PERIOD_D1*60;
typeorderm = OP_SELLSTOP;
//----
while(true)
{
ticket=OrderSend(Symbol(),OP_SELLLIMIT,lots,Bid+pips*10*point,0,0,0,text,16384,expiration,Red);
if(ticket<=0) Print("Error = ",GetLastError());
else { Print("ticket = ",ticket); break; }
//---- 10 seconds wait
Sleep(100);
}
return(0);
}
void OpBuyLimit(int pips, string text, double lots)
{
int ticket,expiration;
double point;
double typeorderm;
//----
point=MarketInfo(Symbol(),MODE_POINT);
expiration=CurTime()+PERIOD_D1*60;
typeorderm = OP_BUYSTOP;
//----
while(true)
{
ticket=OrderSend(Symbol(),OP_BUYLIMIT,lots,Ask-pips*10*point,0,0,0,text,16385,expiration,Blue);
if(ticket<=0) Print("Error = ",GetLastError());
else { Print("ticket = ",ticket); break; }
//---- 10 seconds wait
Sleep(100);
}
return(0);
}
void CloseAllPositions()
{
int total = OrdersTotal();
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
bool result = false;
switch(type)
{
//Close opened long positions
case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positions
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
break;
//Close pending orders
case OP_BUYLIMIT :
case OP_BUYSTOP :
case OP_SELLLIMIT :
case OP_SELLSTOP : result = OrderDelete( OrderTicket() );
}
if(result == false)
{
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
}
return(0);
}