
//+------------------------------------------------------------------+
//| Функция открытия ордера |
//|------------------------------------------------------------------|
//| Параметры запроса: |
//| OpenOrder("BUY") - Открытие ордера на покупку (BUY) |
//| OpenOrder("SELL") - Открытие ордера на продажу (SELL) |
//+------------------------------------------------------------------+
void OpenOrder(string type)
{
double StopLoss = 0;
double TakeProfit = 0;
//--- Инициализация переменых ----------------------------------------
int ticket = 0;
string symbol /* Cимвол */ = Symbol();
ENUM_ORDER_TYPE cmd /* Торговая операция */ = ORDER_TYPE_BUY;
double volume /* Количество лотов */ = LotsOptimized();
double price /* Цена */ = 0.0;
int slippage /* Проскальзывание */ = 3;
double stoploss /* stop loss */ = 0;
double takeprofit /* take profit */ = 0;
string comment /* Комментарий */ = NULL;
int magic /* Идентификатор */ = MAGICMA;
datetime expiration /* Cрок истечения ордера */ = 0;
color arrow_color /* Цвет */ = clrNONE;
//--- Получим информацию по символу ----------------------------------
double bid = MarketInfo(symbol,MODE_BID); // Запрос значения Bid
double ask = MarketInfo(symbol,MODE_ASK); // Запрос значения Ask
double point = MarketInfo(symbol,MODE_POINT); // Запрос Point
double digits = MarketInfo(symbol,MODE_DIGITS); // Запрос Digits
//--------------------------------------------------------------------
//--- Подставим значения под соответствующий тип ордера --------------
if (type == "BUY")
{
cmd = ORDER_TYPE_BUY;
price = NormalizeDouble(Ask,digits);
if (StopLoss > 0) stoploss = NormalizeDouble(Bid - StopLoss * point,digits);
if (TakeProfit > 0) takeprofit = NormalizeDouble(Ask + TakeProfit * point,digits);
arrow_color = Green;
}
if (type == "SELL")
{
cmd = ORDER_TYPE_SELL;
price = NormalizeDouble(Bid,digits);
if (StopLoss > 0) stoploss = NormalizeDouble(Ask + StopLoss * point,digits);
if (TakeProfit > 0) takeprofit = NormalizeDouble(Bid - TakeProfit * point,digits);
arrow_color = Red;
}
//--- Проверим достаточно ли средств для открытия ордера -------------
double free_margin=AccountFreeMarginCheck(symbol,cmd,volume);
if(free_margin<0) //Если на счету не хватает средств
{
string oper=(cmd==OP_BUY)? "Buy":"Sell";
Print("Not enough money for ", oper," ",volume, " ", symbol, " Error code=",GetLastError());
return;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
if(free_margin>0)
{ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);}
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Проверяет объем ордера на корректность |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
{
//--- минимально допустимый объем для торговых операций
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(volume<min_volume)
{
description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(false);
}
//--- максимально допустимый объем для торговых операций
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(volume>max_volume)
{
description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(false);
}
//--- получим минимальную градацию объема
double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
volume_step,ratio*volume_step);
return(false);
}
description="Корректное значение объема";
return(true);
}
if (CheckVolumeValue(iLots)==TRUE) ticket = OrderSend...
bool CheckVolumeValue(double volume)
{
string description;
double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); //Минимально допустимый объем для торговых операций
if(volume<min_volume)
{
description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(FALSE);
}
double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); //Максимально допустимый объем для торговых операций
if(volume>max_volume)
{
description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(FALSE);
}
double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); //Получим минимальную градацию объема
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
volume_step,ratio*volume_step);
return(FALSE);
}
description="Корректное значение объема";
return(TRUE);
}
bool CheckVolumeValue(double volume,string &description)
?gd_240 = 0;
double ld_56 = 0;
for (index = OrdersTotal() - 1; index >= 0; index--)
{
OrderSelect(index, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
gd_240 += OrderOpenPrice() * OrderLots();
ld_56 += OrderLots();
}
}
}
gd_240 = NormalizeDouble(gd_240 / ld_56, Digits);
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double LotsOptimized()
{
//--- Инициализация переменых ----------------------------------------
double volume = 0;
double lot = 0.01;
double exponent = 2;
double count = CountOpenOrders();
int digits = (int)2; //MarketInfo(Symbol(),MODE_DIGITS);
//--------------------------------------------------------------------
volume = NormalizeDouble(lot * MathPow(exponent, count),digits);
//--------------------------------------------------------------------
return(volume);
}
//+------------------------------------------------------------------+/code>
Kudryashov