Проверка

 
Подскажите пожалуйста, как добавить в советник проверку на достаточность средств? Лазал по FAQ ничего не понял. Объясните подробно, кому не сложно.
 
TheGODofTradeFX:
Подскажите пожалуйста, как добавить в советник проверку на достаточность средств? Лазал по FAQ ничего не понял. Объясните подробно, кому не сложно.

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

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

 
_new-rena:

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

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

 

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

 
TheGODofTradeFX:
в коде базе поищите советники на темы риск-менеджмента и маркет-менеджмента. ссылка в самом верху этой и любой странички форума
 
_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");


  } 

 

 
TheGODofTradeFX:


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

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

 

ага. Тут есть хорошая кнопка для вставки кода "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
Написал себе такую "открывалку", проверяет доступность средств перед открытием ордера. Выпилите кусок нужного кода или пользуйтесь целиком.
 
Kino:
Написал себе такую "открывалку", проверяет доступность средств перед открытием ордера. Выпилите кусок нужного кода или пользуйтесь целиком.
Неплохо. Разве что, бывает добавляют еще попытки через while или for
 
Alex2356:
Неплохо. Разве что, бывает добавляют еще попытки через while или for 
Если надо добавлять такой цикл, то лучше сразу менять брокера!!!!!
 
dimeon:
Если надо добавлять такой цикл, то лучше сразу менять брокера!!!!!
Ну цены, к сожалению, не всегда идеально доступны и исполняются моментом. При сильных движениях вообще разрывы жуткие бывают. Тут либо проскальзывание большое ставить, либо вообще ограничить торговлю. Обрыв связи. Робот послал запрос, а инета нет, вот и что ему без попыток делать - сказать: я 1 один раз попытался, больше мне не говорили.