[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 814

 
Open[1] Close[1]
 

Баланс 600-1199 лот 0,1

Баланс 1200-1799 лот 0,2

Баланс 1800-2399 лот 0,3 и т.д. 

Как организовать в советнике? Спасибо. 

 
Maniac:

Баланс 600-1199 лот 0,1

Баланс 1200-1799 лот 0,2

Баланс 1800-2399 лот 0,3 и т.д. 

Как организовать в советнике? Спасибо. 

double Lot()
{
   double balance=AccountBalance();
   if (balance>600 && balance<1199) return(0.1);
   if (balance>1200 && balance<1799) return(0.2);
   if (balance>1800 && balance<2399) return(0.3);
return(MarketInfo(Symbol(), MODE_MINLOT));
}
 

вызывать: ticket=OrderSend(Symbol(),OP_BUY,Lot(),Ask,3,Bid-25*Point,Ask+25*Point,"My order #",magic,0,CLR_NONE);
 
IgorM:

вызывать: ticket=OrderSend(Symbol(),OP_BUY,Lot(),Ask,3,Bid-25*Point,Ask+25*Point,"My order #",magic,0,CLR_NONE);

При этом баланс может быть в облаках, а эквити в большой просадке. Соответственно размер лота может оказаться больше, чем возможно открыть и вся конструкция кубарем покатится...

Перед открытием лучше лот корректировать под действительно возможный.

Делал я для этого функцию. Её немного подкорректировал Виктор (Vinin) - попоробуйте:

// ===========================================================================
// --- Функция рассчёта величины лота для открытия позиции. Редакция VininI---
// Если лот превышает возможный для открытия позы, то он корректируется 
// ===========================================================================

double CorrectLots(double lt)
{
   double ltcorr;
   double pnt =      MarketInfo(Symbol(),MODE_POINT);
   double mspr =     MarketInfo(Symbol(),MODE_SPREAD);
   double dig =      MarketInfo(Symbol(),MODE_DIGITS);
   double MaxLot =   MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLot =   MarketInfo(Symbol(),MODE_MINLOT);
   double StpLot =   MarketInfo(Symbol(),MODE_LOTSTEP);
   double OneLot =   MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);    // Свободные средства, разрешенные к торговле
   
   
   double Money=lt*OneLot+mspr*pnt;          // Вычисляем стоимость открываемой позы
   if (Money>=TradeMrg)                      // Если цена позиции равна или больше, чем есть свободных средств, то ...
      {
         lt=MathFloor(TradeMrg/OneLot/StpLot)*StpLot;  // ... рассчитаем допустимый лот
         Print("Func CorrectLots: полученный лот ",lt," скорректирован под допустимый ",lt); 
      }
      else 
         Print("Func CorrectLots: лот вернули без изменений");
   lt=MathMin(MaxLot, MathMax(MinLot, lt)); // Проверим превышение допустимых ...
   
   return(lt);                            
}

В строке

double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);    // Свободные средства, разрешенные к торговле

... свободная маржа делится на четыре и только четверть свободных средств считаются разрешенными для торгов.

Можете убрать деление на 4 и поставить сколь угодно, хоть всю маржу использовать.

Но функция не даст использовать размер лота больше, чем допустимо.

 
artmedia70:
При этом баланс может быть в облаках, а эквити в большой просадке. Соответственно размер лота может оказаться больше, чем возможно открыть и вся конструкция кубарем покатится...


ну почему же так все грустно...

последний return() в моей функции даст минимальный доступный лот по инструменту, если счет центовый с большим кредитным плечом, то когда баланс будет меньше 600, возможно експерт еще поторгует некоторое время :)

ЗЫ: задача конкретная, да и ветка чтобы дать направление поисков вопрошающему 

 
IgorM:


ну почему же так все грустно...

последний return() в моей функции даст минимальный доступный лот по инструменту, если счет центовый с большим кредитным плечом, то когда баланс будет меньше 600, возможно експерт еще поторгует некоторое время :)

ЗЫ: задача конкретная, да и ветка чтобы дать направление поисков вопрошающему

Ну, простите великодушно... :) Не извольте гневиться, сударь... :)

Вот ф-ция в моей редакции:

// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

double CorrectLots(double lt)
{
   double ltcorr;
   double pnt =      MarketInfo(Symbol(),MODE_POINT);
   double mspr =     MarketInfo(Symbol(),MODE_SPREAD);
   double dig =      MarketInfo(Symbol(),MODE_DIGITS);
   double MaxLot =   MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLot =   MarketInfo(Symbol(),MODE_MINLOT);
   double StpLot =   MarketInfo(Symbol(),MODE_LOTSTEP);
   double OneLot =   MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);      // Свободные средства, разрешенные к торговле
   
   lt=MathAbs(lt);
   ltcorr=lt;                       // Зададим начальное значением ltcorr равным значению lt
   
   if (lt>=MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<=MinLot) ltcorr=MinLot;   // ... значений лота
   
   double Money=lt*OneLot+mspr*pnt; // Вычисляем стоимость открываемой позы

   if (Money<TradeMrg)              // Если свободных средств больше, чем цена позиции - 
      {
         return(ltcorr);            // ... возвращаем неизменённый лот
      }
   else if (Money>=TradeMrg)        // Если цена позиции равна или больше, чем есть свободных средств, то ...
      {
         ltcorr=MathAbs(MathFloor(TradeMrg/OneLot/StpLot)*StpLot);       // ... рассчитаем допустимый лот
         double MoneyCorr=ltcorr*OneLot+mspr*pnt;                      
         Print("Func CorrectLots: лот ",lt," скорректирован до ",ltcorr,
               " Стоимость позы до корректировки = ",Money,
               " Стоимость позы после корректировки = ",MoneyCorr
               ); 
         return(ltcorr);                                                 // ... и вернём его значение
      }
   Print("Func CorrectLots: лот вернули без изменений");
   return(ltcorr);                                                       // Возврат изначального лота в непредусмотренных случаях с сообщением
}
 
IgorM:


ну почему же так все грустно...

последний return() в моей функции даст минимальный доступный лот по инструменту, если счет центовый с большим кредитным плечом, то когда баланс будет меньше 600, возможно експерт еще поторгует некоторое время :)

ЗЫ: задача конкретная, да и ветка чтобы дать направление поисков вопрошающему

Понимаешь, Игорь - тут человек спросил, ты ему правильно ответил и можно как бы и забыть об этом. Но ведь плясать от баланса - не есть гут. По той самой причине, что баланс может быть в заоблачных небесах, а реальное положение дел - спасать пора. А мы тут ещё хр-р-рясь... и сверху ордерочек, да большим лотом... а он р-р-раз, да в минус поехал... эквити - туда же, хотя и так
уже там... Посему я и подсказал, что лучше от средств плясать, чем от баланса... :)

 

Доброго времени суток!

Подскажите пожалуйста новичку, возможно ли написать на MQL4 пользовательский индикатор, так чтобы он одновременно обрабатывал все валютные пары? Насколько я понял максимально может выводится до 8 линий в графике индикатора, но мне нужна будет только одна линия. Т.е. могу ли я для этой линии получить массив обработанный из массивов или переменных по всем валютным пара одновременно?

За ранее благодарен за ответ.

 
Igor_Sev:

 Т.е. могу ли я для этой линии получить массив обработанный из массивов или переменных по всем валютным пара одновременно? 


Теоретически, не вижу никаких препятствий. Другой вопрос, сможете ли конкретно Вы  этот массив обработать.
 
Roger:

Теоретически, не вижу никаких препятствий. Другой вопрос, сможете ли конкретно Вы этот массив обработать.


а каким образом я могу обратиться ко всем валютным парам в программном коде при написании инструмента? Просматривал примеры написания инструментво, там нет обращения к валютной паре, обрабатывается по умолчанию та, которая привязана к конкретному графику котировок.

У меня дело в том что этим всем сейчас занимается Excel и VBA, через DDE сервер я получаю информацию по 22 валютным парам и с помощью программного кода VBA виду их одновременную обработку, но это крайне не удобно, потому что во-первых надо ждать 2 часа накопления истории данных для проведения анализа по графикам в Excel. Да и неудобно прыгать с программы в программу, вот и думаю как бы это все перенести в МТ4.

Причина обращения: