Этот код представляет из себя сценарий для закрытия всех открытых ордеров на заданном символе или всех символах, если указано "All". Он содержит функцию GetSlippage, которая вычисляет разницу между ценами ask и bid для заданного символа.@Добрый робот (ChatGPT)
прокомментируй основные функции кода и объясни их назначение
#property show_confirm
// extern string Name_Expert = "Close All Trades";
//+------------------------------------------------------------------+
//| cal the point range |
//+------------------------------------------------------------------+
double GetSlippage(string XSymbol)
{
double bid =MarketInfo(XSymbol,MODE_BID);
double ask =MarketInfo(XSymbol,MODE_ASK);
double point =MarketInfo(XSymbol,MODE_POINT);
return((ask-bid)/point);
}
void CloseAll(string SymbolToClose,int MagNo) //at Symbol
{
bool result;
int retry;
int cmd,error;
int cnt;
int CloseNo;
double sp,price;
string XSymbol;
for (cnt=10;IsTradeContextBusy();cnt--) {
cnt+=2;
Sleep(10);
//Print("Trade context is busy. Please wait");
}
CloseNo=OrdersTotal();
if(CloseNo==0) return(0);
for(cnt=OrdersTotal();cnt > 0;cnt--) {//last to frist -1
if(OrderSelect(cnt-1,SELECT_BY_POS, MODE_TRADES)==true) {
for(retry=0;retry < 10;retry++) {
if((SymbolToClose=="All") ||
(OrderSymbol()==SymbolToClose && MagNo == 0) ||
(OrderSymbol()==SymbolToClose && OrderMagicNumber() == MagNo)) {
cmd=OrderType();
//RefreshRates();
XSymbol = OrderSymbol();
sp = GetSlippage(XSymbol);
if(cmd==OP_BUY) price=MarketInfo(XSymbol,MODE_BID);// Ask;
if(cmd==OP_SELL) price=MarketInfo(XSymbol,MODE_ASK);// Bid; // not the chart price!!
if(cmd==OP_BUY || cmd==OP_SELL) {
result=OrderClose(OrderTicket(),OrderLots(),price,sp,CLR_NONE);
if(!result) {
error=GetLastError();
Print("LastError = ",error," price=",price," Slippage=",sp);
} else break;
if(error==129 || error==135 || error==146) Sleep(100);// RefreshRates(); 138
}
if(cmd!=OP_BUY && cmd!=OP_SELL) {
result=OrderDelete(OrderTicket());
}
}//if
} //for retry
} else Print( "Error when order select ", GetLastError());//OrderSelect
}//for
CloseNo=CloseNo-OrdersTotal(); //CloseNo-=OrdersTotal();
if(!IsTesting()) Print(CloseNo," Orders Closed, ",SymbolToClose,"=",MagNo," Balance: ", AccountBalance()," Equity: ",AccountEquity(),"Last Profit ",AccountProfit());
}
//+------------------------------------------------------------------+
//| script "close Profit last to 0 order"
//+------------------------------------------------------------------+
int start()
{
bool result;
double price;
int cmd,error;
int cnt;
string XSymbol;
int CloseNo;
CloseNo=OrdersTotal();
CloseAll("All",0);
CloseNo=CloseNo-OrdersTotal();
Print(CloseNo," Orders Closed, Balance: ", AccountBalance()," Equity: ",AccountEquity(),"Last Profit ",AccountProfit());
}
//+------------------------------------------------------------------+
Функция CloseAll выполняет фактическое закрытие ордеров. Она начинает с ожидания, когда торговый контекст будет свободным, чтобы избежать возможных ошибок. Затем она ищет все открытые ордера и закрывает их с использованием функции OrderClose, если это buy или sell ордер, или с помощью OrderDelete, если это другой тип ордера. Если произошла ошибка при закрытии ордера, то функция будет повторять попытку закрытия несколько раз.
Функция start вызывает CloseAll с параметрами "All" и 0, что означает закрытие всех ордеров на всех символах.
Комментарии в коде объясняют каждую часть программы, что делает код более понятным для других программистов, которые могут использовать этот код в своих собственных проектах. Комментарии также указывают на проблемы, которые могут возникнуть при использовании этого кода, такие как возможные ошибки при закрытии ордеров.