Скачать MetaTrader 5

Проверка

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Заведи торговый сигнал. Зарабатывай на платной подписке!
Sergey Laptev
126
Sergey Laptev 2015.03.28 15:37 
Подскажите пожалуйста, как добавить в советник проверку на достаточность средств? Лазал по FAQ ничего не понял. Объясните подробно, кому не сложно.
Gulnaz Akhtyamova
10620
Gulnaz Akhtyamova 2015.03.28 16:08  
TheGODofTradeFX:
Подскажите пожалуйста, как добавить в советник проверку на достаточность средств? Лазал по FAQ ничего не понял. Объясните подробно, кому не сложно.

депо делим на маржу и сравниваем с объемом ордера, который хотим открыть.

к примеру по евро - маржа 200. депо 200. открыть больше чем 1 лот не получиться без увеличения плеча. ну там и маржа и риск уже поменяются.

Sergey Laptev
126
Sergey Laptev 2015.03.28 21:47  
_new-rena:

депо делим на маржу и сравниваем с объемом ордера, который хотим открыть.

к примеру по евро - маржа 200. депо 200. открыть больше чем 1 лот не получиться без увеличения плеча. ну там и маржа и риск уже поменяются.А есть

 

А есть какой-то шаблон кода?? И куда именно значения вставлять? Я вообще не могу этого понять) 

Gulnaz Akhtyamova
10620
Gulnaz Akhtyamova 2015.03.28 22:08  
TheGODofTradeFX:
в коде базе поищите советники на темы риск-менеджмента и маркет-менеджмента. ссылка в самом верху этой и любой странички форума
Sergey Laptev
126
Sergey Laptev 2015.03.29 15:04  
_new-rena:
в коде базе поищите советники на темы риск-менеджмента и маркет-менеджмента. ссылка в самом верху этой и любой странички форума

Спасибо, вставив вот такой код, получил вот такие ошибки 

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");


  } 

 

Vladimir Karputov
Модератор
45813
Vladimir Karputov 2015.03.29 15:16  
TheGODofTradeFX:


Пожалуйста, правильно вставляйте код: Правильно вставляем код на форуме
Gulnaz Akhtyamova
10620
Gulnaz Akhtyamova 2015.03.29 15:18  
TheGODofTradeFX:

Спасибо, вставив вот такой код, получил вот такие ошибки 

 

ага. Тут есть хорошая кнопка для вставки кода "SRC", попробуйте.

В советнике нужно разместить - то что в OnInit - в Oninit, не повторяя второй раз эту функцию и то же самое с OnDeInit.

Vladimir Zubov
4322
Vladimir Zubov 2015.03.29 15:41  
//+----------------------------------------------------------------------------+
//|    Функция открытия ордера  (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
Написал себе такую "открывалку", проверяет доступность средств перед открытием ордера. Выпилите кусок нужного кода или пользуйтесь целиком.
Alexander Fedosov
7611
Alexander Fedosov 2015.03.31 16:13  
Kino:
Написал себе такую "открывалку", проверяет доступность средств перед открытием ордера. Выпилите кусок нужного кода или пользуйтесь целиком.
Неплохо. Разве что, бывает добавляют еще попытки через while или for
Dmitiry Ananiev
6586
Dmitiry Ananiev 2015.04.03 01:31  
Alex2356:
Неплохо. Разве что, бывает добавляют еще попытки через while или for 
Если надо добавлять такой цикл, то лучше сразу менять брокера!!!!!
Alexander Fedosov
7611
Alexander Fedosov 2015.04.04 15:45  
dimeon:
Если надо добавлять такой цикл, то лучше сразу менять брокера!!!!!
Ну цены, к сожалению, не всегда идеально доступны и исполняются моментом. При сильных движениях вообще разрывы жуткие бывают. Тут либо проскальзывание большое ставить, либо вообще ограничить торговлю. Обрыв связи. Робот послал запрос, а инета нет, вот и что ему без попыток делать - сказать: я 1 один раз попытался, больше мне не говорили.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий