- не могу пополнить счёт, кроме пополнения купонами mql5 больше нет вариантов. что за бред. и иконки вариантов отсутствуют. нет иконки вебмани
- Проверка на достаточность средств
- Механическая торговля невозможна! Всё это профанация.
Подскажите пожалуйста, как добавить в советник проверку на достаточность средств? Лазал по FAQ ничего не понял. Объясните подробно, кому не сложно.
депо делим на маржу и сравниваем с объемом ордера, который хотим открыть.
к примеру по евро - маржа 200. депо 200. открыть больше чем 1 лот не получиться без увеличения плеча. ну там и маржа и риск уже поменяются.
депо делим на маржу и сравниваем с объемом ордера, который хотим открыть.
к примеру по евро - маржа 200. депо 200. открыть больше чем 1 лот не получиться без увеличения плеча. ну там и маржа и риск уже поменяются.А есть
А есть какой-то шаблон кода?? И куда именно значения вставлять? Я вообще не могу этого понять)
в коде базе поищите советники на темы риск-менеджмента и маркет-менеджмента. ссылка в самом верху этой и любой странички форума
Спасибо, вставив вот такой код, получил вот такие ошибки
input double Risk = 15.0;
input color LabelColor = clrSilver; //Color
input int FontSize = 10;
input ENUM_BASE_CORNER CORNER = CORNER_LEFT_LOWER;
double Lots = 0.01;
ENUM_ANCHOR_POINT ANCHOR = ANCHOR_LEFT_LOWER;
//+------------------------------------------------------------------+
int OnInit()
{
if (CORNER == CORNER_LEFT_LOWER) ANCHOR = ANCHOR_LEFT_LOWER;
else if (CORNER == CORNER_LEFT_UPPER) ANCHOR = ANCHOR_LEFT_UPPER;
else if (CORNER == CORNER_RIGHT_LOWER) ANCHOR = ANCHOR_RIGHT_LOWER;
else if (CORNER == CORNER_RIGHT_UPPER) ANCHOR = ANCHOR_RIGHT_UPPER;
ObjectCreate(0, "Lot", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "Lot", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "Lot", OBJPROP_YDISTANCE, 20);
ObjectSetInteger(0, "Lot", OBJPROP_CORNER, CORNER);
ObjectSetString(0, "Lot", OBJPROP_FONT, "Arial");
ObjectSetInteger(0, "Lot", OBJPROP_FONTSIZE, FontSize);
ObjectSetInteger(0, "Lot", OBJPROP_ANCHOR, ANCHOR);
ObjectSetInteger(0, "Lot", OBJPROP_COLOR, LabelColor);
ObjectSetInteger(0, "Lot", OBJPROP_HIDDEN, true);
ObjectSetInteger(0, "Lot", OBJPROP_SELECTABLE, false);
//---
ObjectCreate(0, "Risk", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "Risk", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "Risk", OBJPROP_YDISTANCE, 40);
ObjectSetInteger(0, "Risk", OBJPROP_CORNER, CORNER);
ObjectSetString(0, "Risk", OBJPROP_FONT, "Arial");
ObjectSetInteger(0, "Risk", OBJPROP_FONTSIZE, FontSize);
ObjectSetInteger(0, "Risk", OBJPROP_ANCHOR, ANCHOR);
ObjectSetInteger(0, "Risk", OBJPROP_COLOR, LabelColor);
ObjectSetInteger(0, "Risk", OBJPROP_HIDDEN, true);
ObjectSetInteger(0, "Risk", OBJPROP_SELECTABLE, false);
//---
ObjectCreate(0, "Spread", OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, "Spread", OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, "Spread", OBJPROP_YDISTANCE, 60);
ObjectSetInteger(0, "Spread", OBJPROP_CORNER, CORNER);
ObjectSetString(0, "Spread", OBJPROP_FONT, "Arial");
ObjectSetInteger(0, "Spread", OBJPROP_FONTSIZE, FontSize);
ObjectSetInteger(0, "Spread", OBJPROP_ANCHOR, ANCHOR);
ObjectSetInteger(0, "Spread", OBJPROP_COLOR, LabelColor);
ObjectSetInteger(0, "Spread", OBJPROP_HIDDEN, true);
ObjectSetInteger(0, "Spread", OBJPROP_SELECTABLE, false);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTick()
{
double Spread = MarketInfo(Symbol(), MODE_SPREAD);
string TxtLot = "Lot = " + DoubleToString(Lots, 2);
string TxtRisk = "Risk = " + DoubleToString(Risk, 2) + "%";
string TxtSpread = "Spread = " + DoubleToString(Spread,0);
Lots = calculate_lot();
if (ObjectFind(0, "Lot") == 0 ) ObjectSetString(0, "Lot", OBJPROP_TEXT, TxtLot);
if (ObjectFind(0, "Risk") == 0 ) ObjectSetString(0, "Risk", OBJPROP_TEXT, TxtRisk);
if (ObjectFind(0, "Spread") == 0 ) ObjectSetString(0, "Spread", OBJPROP_TEXT, TxtSpread);
}
//+------------------------------------------------------------------+
double calculate_lot()
{
double Free = AccountFreeMargin();
double One_Lot = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
double Step = MarketInfo(Symbol(), MODE_LOTSTEP);
double MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
double MinLot = MarketInfo(Symbol(), MODE_MINLOT);
double result = MathFloor(Free * Risk / 100 / One_Lot / Step) * Step;
if (result > MaxLot) result = MaxLot;
else if (result < MinLot) result = MinLot;
return(result);
}
//+-------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectDelete("Lot");
ObjectDelete("Risk");
ObjectDelete("Spread");
}
Спасибо, вставив вот такой код, получил вот такие ошибки
ага. Тут есть хорошая кнопка для вставки кода "SRC", попробуйте.
В советнике нужно разместить - то что в OnInit - в Oninit, не повторяя второй раз эту функцию и то же самое с OnDeInit.
//+----------------------------------------------------------------------------+ //| Функция открытия ордера (c)Kino | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - текущий символ) | //| op - операция | //| ll - лот | //| sl - уровень стоп | //| tp - уровень тейк | //| mn - MagicNumber | //+----------------------------------------------------------------------------+ bool OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) { if (op == 0) // открытие BUY { // проверяем доступность свободных средств if((AccountFreeMarginCheck(sy,OP_BUY,ll)<=0) || (GetLastError()==134)) { Print(sy," ",ll," It is impossible to open the order Buy, not enough money."); return(0); } RefreshRates(); // открываем ордер int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,GetNameOP,mn,0,CLR_NONE); if(ticketbuy<0) Print(sy," OpenPosition. OrderSend завершилась с ошибкой #",GetLastError()); else Print(sy," OpenPosition. Функция OrderSend успешно выполнена"); // Sleep (Pause); // модифицируем ордер (выставляем тейпрофит и стоплосс) if (sl !=0 || tp !=0) { //--- вычисленные значения цен SL и TP должны быть нормализованы double BSLoss = NormalizeDouble(MarketInfo(sy,MODE_ASK)-sl*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); double BTProfit = NormalizeDouble(MarketInfo(sy,MODE_ASK)+tp*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if (sl == 0) BSLoss = 0; if (tp == 0) BTProfit = 0; bool resbuy = OrderModify (ticketbuy,OrderOpenPrice(),BSLoss,BTProfit,0,CLR_NONE); if(!resbuy) Print(sy," OpenPosition. Ошибка модификации ордера Buy. Код ошибки=",GetLastError()); else Print(sy," OpenPosition. Цена Stop Loss ордера успешно модифицирована."); } } if (op == 1) // открытие Sell { // проверяем доступность свободных средств if((AccountFreeMarginCheck(sy,OP_SELL,ll)<=0) || (GetLastError()==134)) { Print(sy," ",ll," It is impossible to open the order Sell, not enough money."); return(0); } RefreshRates(); // открываем ордер int ticketsell = OrderSend(sy,OP_SELL,ll,MarketInfo(sy,MODE_BID),Slippage,0,0,GetNameOP,mn,0,CLR_NONE); if(ticketsell<0) Print(sy," OpenPosition. OrderSend завершилась с ошибкой #",GetLastError()); else Print(sy," OpenPosition. Функция OrderSend успешно выполнена"); // Sleep (Pause); // модифицируем ордер (выставляем тейпрофит и стоплосс) if (sl !=0 || tp !=0) { //--- вычисленные значения цен SL и TP должны быть нормализованы double SSLoss = NormalizeDouble(MarketInfo(sy,MODE_BID)+sl*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); double STProfit = NormalizeDouble(MarketInfo(sy,MODE_BID)-tp*MarketInfo(sy,MODE_POINT),(int)MarketInfo(sy,MODE_DIGITS)); //--- если входящие значения ноль то заменяем цену модификации на ноль if (sl == 0) SSLoss = 0; if (tp == 0) STProfit = 0; bool ressell = OrderModify (ticketsell,OrderOpenPrice(),SSLoss,STProfit,0,CLR_NONE); if(!ressell) Print(sy," OpenPosition. Ошибка модификации ордера Sell. Код ошибки=",GetLastError()); else Print(sy," OpenPosition. Цена Stop Loss ордера успешно модифицирована."); } } return (True); } // EndНаписал себе такую "открывалку", проверяет доступность средств перед открытием ордера. Выпилите кусок нужного кода или пользуйтесь целиком.
Написал себе такую "открывалку", проверяет доступность средств перед открытием ордера. Выпилите кусок нужного кода или пользуйтесь целиком.
Неплохо. Разве что, бывает добавляют еще попытки через while или for
Если надо добавлять такой цикл, то лучше сразу менять брокера!!!!!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования