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