//+------------------------------------------------------------------+
//| расчёт лота |
//+------------------------------------------------------------------+
double MoneyManagement()
{
double DynamicLot=0;
double Free_Equity=MathMax( AccountEquity(),AccountBalance());
if(Free_Equity<=0)return(0);
double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE);
double LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
double MxLot=MarketInfo(Symbol(),MODE_MAXLOT);
if (TickValue*LotStep!=0) DynamicLot=MathFloor((Free_Equity*MathMin(AutoLot/100,100)/100000)/TickValue/LotStep)*LotStep;
//Print(DynamicLot,"DynamicLot");
if(DynamicLot<MinLot)DynamicLot=MinLot;
if(DynamicLot>MxLot)DynamicLot=MxLot;
return(DynamicLot);
}
//+------------------------------------------------------------------
//| Смотрим историю
//+------------------------------------------------------------------
bool Histori(int year,int month, int day, int hour)//
{
for ( i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(year==TimeYear(OrderOpenTime()))
{
if(month==TimeMonth(OrderOpenTime()))
{
if(day==TimeDay(OrderOpenTime()))
{
if(hour==TimeHour(OrderOpenTime()))
{
return(true);
}
}
}
}
}
}
}
return(false);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type, double price, double stoploss, double takeprofit, double Alot)
{
int r=0,co=0;
color clr=Green;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{//устанавливаем параметры для ордеров
clr=Red;
if(stoploss>0) sl=NormalizeDouble(price+stoploss*Point,Digits);
if(takeprofit>0) tp=NormalizeDouble(price-takeprofit*Point,Digits);
}
if(type==0 || type==2 || type==4)
{//устанавливаем параметры для ордеров
clr=Blue;
if(stoploss>0) sl=NormalizeDouble(price-stoploss*Point,Digits);
if(takeprofit>0) tp=NormalizeDouble(price+takeprofit*Point,Digits);
}
if(Alot==0)//Проверяем А-лот. Если А-лот больше нуля, то ордер не выставился в первый раз. Если А-лот равен нулю, значит выставляем ордер в первый раз и нужно задать параметр автолота.
{
if(AutoLot<=0){lot=Lots;}
if(AutoLot>0){lot=MoneyManagement();}
up=CountOrders(0);
dn=CountOrders(1);
//закрываем ордера, ставим множитель по мартингейлу
if(type==0&&dn>0){lot=NormalizeDouble(lot*Klot*dn,Digits);CloseAll(1);}
if(type==1&&up>0){lot=NormalizeDouble(lot*Klot*up,Digits);CloseAll(0);}
if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
Sleep(10000);
//всё хорошо, все ордера закрылись, теперь запоминаем размер А-лота на всякий случай
Alot=lot;
}
//На всякий случай А-лот запомнили не зря
else
{
lot=Alot;
//закрываем ордера, ставим множитель по мартингейлу
if(type==0&&dn>0){lot=NormalizeDouble(lot*Klot*dn,Digits);CloseAll(1);}
if(type==1&&up>0){lot=NormalizeDouble(lot*Klot*up,Digits);CloseAll(0);}
if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
Sleep(10000);
//всё хорошо, все ордера закрылись, теперь запоминаем размер А-лота на всякий случай
if(Alot<lot)Alot=lot;
}
//если ордера остались, то повторяем цикл через выставление ордера без выставления ордера
up=CountOrders(0);
dn=CountOrders(1);
if(type==0&&dn>0)PutOrder(type,price, stoploss, takeprofit, Alot);
if(type==1&&up>0)PutOrder(type,price, stoploss, takeprofit, Alot);
r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,sl,tp," Момент ",Magic,TimeCurrent()+Expir*60*60,clr);//
Sleep (10000);//ждём 10 секунд
co=GetLastError();//тут проверяем есть ли ошибка
if (co==0)Alot=0;
if (r==0)//если ордера нету и есть ошибка, пробуем выставлять ордер повторно
{if ( co==4||co==6||co==129||co==128||co==135||co==136||co==137||co==138||co==141||co==145||co==146||co==4107)
PutOrder(type,price, stoploss, takeprofit, Alot);
}
//выводим на экран номер ошибки и номер робота по меджик номеру
if(co!=0)Alert("Текущая ошибка ", co,"\r\n" ,", Модель: ",Magic);
//последний аванпост по защите сделки
Sleep (1000*60*5);//на всякий случай ждём 5 минут, проверяем терминал на наличие выставленого ордера и если его нет , то выставляем ордер
if(Histori(Year(),Month(),Day(),Hour())==false)PutOrder(type,price, stoploss, takeprofit, Alot);
//Ура! Ордер есть ! Продолжаем работу!
return;
}
<code>for (int i=OrdersTotal(); i>OrdersTotal()-1; i--) </code>
Что бы стоять на месте, нужно бежать.
А что бы двигаться, нужно бежать в два раза быстрее.
axe44