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

 
eugggy:
В общих чертах понятно, а что значит if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))break; если не выбран такой-то ордер, то прервать или как?


OrderSelect (см. https://docs.mql4.com/ru/trading/OrderSelect) возвращает FALSE при неудачном завершении функции. Оператор break см. https://docs.mql4.com/ru/basis/operators/break.

Можно упростить до

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

главное ордер выбрать.

 
eugggy:


А для меня это выглядит, как абсолютно разные вещи. Скажите, а можно в Ваш код вот это вставить if(Tip==OP_BUYSTOP||Tip==OP_SELLSTOP&&Minute()<59&&Minute()>57) OrderDelete(Ticket);

и если да, то в какую часть?


Не видя вашего кода, могу предположить, что вместо (всё зависит от вашего алгоритма):

if(OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket());
if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
if(OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket());
if(OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket());

только порядок в переменных надо навести и скобки в условии с || и && правильно расставить.

Условие Minute()<59&&Minute()>57 можно сократить до Minute()==58 или используйте >= или <=

Для принудительного закрытия отложенного ордера в конце периода или в определённое время при его установке можно задавать параметр expiration (срок истечения ордера) - см. https://docs.mql4.com/ru/trading/OrderSend. В этом случае не надо возиться с программированием его закрытия. И закрыт ордер будет однозначно без поправки на отсутствие связи

 
eugggy:

Да, много полезностей. Я бы и без халявы обошёлся, но уж очень учебник мудрёно написан.
Вот видите... Я к вопросу о том как "сейчас разговаривают" :)

Халява, чуваки! Ёу! Комон эври боди!!!

Наверное, если бы ТАК учебник СК был написан было бы на 6+

Сорри за оффтоп...

 
eugggy:

Нет, вместо не нужно, нужно в дополнение, я по графику посмотрел: иногда цена не выходит из канала High-Low и отложенные ордера остаются. Только нужно, закрыть отложенные до появления новых, если экспирацией можно это решить - я только за. На счёт книги 1986г Вы серьёзно? Я хоть сам древний, но по моему это перебор.


В дополнение, так надо дополнительный аналогичный код и писать. Мне почему-то кажется, что у Вас с кодом какой-то ералаш получается.

Насчёт книги 1986 года я не пошутил. Повторюсь, если Вы желаете постигнуть азы программирования, то их надо постигать не засоряя себе голову современными языковыми конструкциями. Вам нужны основы. Учебники по информатике для средней школы, особенно первый, методично грамотно составлены для "тупых". Как, кем, для кого и зачем пишутся современные учебники - это отдельная тема

 

     дата          время             лотов  прайс

26 2010.01.05 12:24 sell 12    0.10   1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 buy 13    0.26   1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 sell 14    0.43   1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 buy 15    0.72   1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 sell 16    1.19   1.44026 1.44907 1.43526 0.00 3200.09

Вот открыто 5 ордеров в соответствующих направлениях.

Как посчитать суммарную маржу по всем открытым ордерам?

Пара: ЕВРОДОЛЛАР, контракт 100000, плечо 100.

 
ikatsko:

дата время лотов прайс

26 2010.01.05 12:24 sell 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 buy 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 sell 14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 buy 15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 sell 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Вот открыто 5 ордеров в соответствующих направлениях.

Как посчитать суммарную маржу по всем открытым ордерам?

Пара: ЕВРОДОЛЛАР, контракт 100000, плечо 100.

MarketInfo(Symbol(),MODE_MARGINREQUIRED);

Возвращает размер свободных средств, необходимых для открытия 1 лота на покупку, ну и поглядите иже с ними, в зависимости от вашей необходимости.

Ещё может быть вот это пригодится:

double AccountFreeMarginCheck( string symbol, int cmd, double volume)

Возвращает размер свободных средств, которые останутся после открытия указанной позиции по текущей цене на текущем счете. Если свободных средств не хватает, то будет сгенерирована ошибка 134 (ERR_NOT_ENOUGH_MONEY).
 
Спасибо за быстрый ответ, но я хочу посчитать маржу ДО ТОГО, до того как откроются эти позиции! Стратегия - лавина, необходимо знатьне наступит ли Стоп Аут после открытия соответствующих позиций? Резмеры лотов на все предстоящие лоты известны заранее. Хочется знать: сколько ордеров (с заранее известными нарастающими лотами) можно будет открыть?
 
ikatsko:
Спасибо за быстрый ответ, но я хочу посчитать маржу ДО ТОГО, до того как откроются эти позиции! Стратегия - лавина, необходимо знатьне наступит ли Стоп Аут после открытия соответствующих позиций? Резмеры лотов на все предстоящие лоты известны заранее. Хочется знать: сколько ордеров (с заранее известными нарастающими лотами) можно будет открыть?
// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

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=ltcorr*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: лот вернули без изменений");
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   return(ltcorr);                            // Возврат изначального лота в непредусмотренных случаях с сообщением
}

Попробуйте что-нибудь высмотреть для себя... :)

И, опять-таки

double AccountFreeMarginCheck( string symbol, int cmd, double volume)

Данную функцию использовал в советнике на заказ, который тоже использует голимый мартингейл.
Для более стабильной его работы перед открытием любой позы писал строчку:

double lt;                           // Лот
// --------------------------------- +

lt=CorrectLots(lt*2);                // Умножаем лот на 2 с проверкой и коррекцией под допустимый размер лота

// ------- Открытие позы ----------- +
 
Артем, мне надо самому рассчитать маржу, то есть знасть формулу расчета. Мне не нужен ответ терминала о текущих возможностях. Формулу расчета я собственно знаю, но есть какая-то особенность расчета маржи по перекрываемым позициям.!!! А я не знаю даже, что такое перекрываемые позиции! Специально привел пример, где видно, что позиции каждая последующая открывается в противоположном к предыдущему направлении. Если посчитать маржу по открытым позициям путем суммирования всех лотов (и вставить эту сумму в формулу), то это не совпадает с фактической реакцией ДЦ, когда он применяет СтопАут. Хотел бы считать так как считает ДЦ
 
ikatsko:
Артем, мне надо самому рассчитать маржу, то есть знасть формулу расчета. Мне не нужен ответ терминала о текущих возможностях. Формулу расчета я собственно знаю, но есть какая-то особенность расчета маржи по перекрываемым позициям.!!! А я не знаю даже, что такое перекрываемые позиции! Специально привел пример, где видно, что позиции каждая последующая открывается в противоположном к предыдущему направлении. Если посчитать маржу по открытым позициям путем суммирования всех лотов (и вставить эту сумму в формулу), то это не совпадает с фактической реакцией ДЦ, когда он применяет СтопАут. Хотел бы считать так как считает ДЦ

Перекрываемые позиции не равно ли локированные? Это маржа требуемая для поддержания двух открытых позиций равного объема, но противоположного направления. Обычно она в два раза меньше, чем маржа, требуемая для поддержания одной открытой позиции того же объема, что и одна из двух локированных.

Я обратил внимание сразу же, но не думал, что это может ввести вас в замешательство...

Для того же советника я считал маржу так, не знаю теперь, может и неверно??? :

// ======================================================================
// -------------------------- Рассчёт свободной маржи -------------------
// ======================================================================
bool LastFreeMargin(string sy, int op, double lot)
{
   if (sy=="0" || sy=="") sy=Symbol();
   double FreeEqu  = AccountFreeMargin();                         // Вся маржа
   double FreeEqu4 = NormalizeDouble(Equ_Start/4.0, 2);           // Делим маржу на 4 (Средства для торговли)
   double CheckEqu = AccountFreeMarginCheck(sy, op, lot);         // Остаток всех средств после открытия позы 
   double EquTrade = FreeEqu-CheckEqu;                            // Средства, требуемые для открытия следующей
   
   if (FreeEqu4-EquTrade>0) return(true);
   else return(false);
}   

Вот это всё, что вам возвращает ДЦ:

MODE_MARGININIT 29 Начальные залоговые требования для 1 лота
MODE_MARGINMAINTENANCE 30 Размер залоговых средств для поддержки открытых позиций в расчете на 1 лот
MODE_MARGINHEDGED 31 Маржа, взимаемая с перекрытых позиций в расчете на 1 лот
MODE_MARGINREQUIRED 32 Размер свободных средств, необходимых для открытия 1 лота на покупку
Причина обращения: