Расчет залоговых средств. В чем ошибка? - страница 5

 

Если до вечера 26 мая 2024 года Ваш код не появится здесь, буду считать все Ваши высказывания пустопорожней болтовней.

И далее к Вашим сообщениям буду относиться таким же образом. Буду их игнорировать.

 
Eugeni Neumoin #:

Если до вечера 26 мая 2024 года Ваш код не появится здесь, буду считать все Ваши высказывания пустопорожней болтовней.

И далее к Вашим сообщениям буду относиться таким же образом. Буду их игнорировать.

На форуме здесь никто Вам ничем не обязан. Равно, как и Вы никому. 
Про Алексея могу сказать: код он Вам вряд ли покажет. Почему? SSD у него сдох. По этой же причине он и мне не смог помочь в одном моëм вопросе. За это я его не посчитал (кем Вы его там собрались считать?) А в чëм разница? В людях. 
... А ветку, указанную Алексеем, таки почитайте. Там есть информация же. 
 

Эксперимент проведу в понедельник на валютной паре GBPUSD

Это демо счет типа Маркет (Это, похоже, аналог ECN):

Market demo


Это демо счет типа Instant:

Инвесторский пароль для демо счетов в Форекс клубе, почему-то, не генерируется.

Свой код сегодня выложу, а результаты работы  будут в понедельник 27 мая 2024 года. 

Задано:

размер одного ордера - 5 лотов;

количество одновременно открываемых ордеров - 15;

установлен размер прибыли на одну сделку (на один ордер) - 200$;

комиссия не учитывается.

На картинках программа настроена на сделки Buy. Это сейчас для наглядности. В понедельник посмотрю, может, и Sell сделки будут.

Также на картинках выведена два индикатора одновременно.

Один показывает уровни по так называемому "снайперу" с M15.

Второй индикатор показывает структурные точки и idm по одной из стратегий смарт мани на текущем тайм фрейме.

 
Artyom Trishkin #:
На форуме здесь никто Вам ничем не обязан. Равно, как и Вы никому. 
Про Алексея могу сказать: код он Вам вряд ли покажет. Почему? SSD у него сдох. По этой же причине он и мне не смог помочь в одном моëм вопросе. За это я его не посчитал (кем Вы его там собрались считать?) А в чëм разница? В людях. 
... А ветку, указанную Алексеем, таки почитайте. Там есть информация же. 

Проведу эксперимент для более точного понимания сути проблемы.

Результат сообщу. С подробным описанием и с картинками. Ни к кому не отношусь предвзято. 

Просто бывает, что на форуме участники часто не вникают в суть проблемы.

Из-за этого ситуация может накаляться.

 

В лог будет выводиться информация :

Print(__LINE__,"  AccountEquity=",AccountEquity(),"  MARGINREQUIRED_1=",AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_BUY,5),"  MARGINREQUIRED_2=",5*MarketInfo(Symbol(),MODE_MARGINREQUIRED));

Размер Эквити перед сделкой. Размер взимаемой маржи по сложной формуле для 5-ти лотов в сделке. Размер взимаемой маржи по простой формуле для 5-ти лотов в сделке.

После проведения каждой сделки в результат, полагаю, достаточно выводить только размер остаточного Эквити:

Print(__LINE__,"  AccountEquity=",AccountEquity());

Ну и начальную картинку - до эксперимента. И конечную картинку после открытия всех 15-ти сделок.

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

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


Ниже код программы для расчета маржи по проведенным ранее сделкам.

   double summa_lots_buy_1=0, summa_lots_sell_1=0; // сумма залоговой маржи по сложной формуле
   double summa_lots_buy_2=0, summa_lots_sell_2=0;  // сумма залоговой маржи по простой формуле
   double summa_lots_buy=0, summa_lots_sell=0;
      double MARGINREQUIRED=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
      double MARGINREQUIRED_2=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
      double MARGINREQUIRED_1=AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_BUY,5);
      
      if (MarketInfo(Symbol(),MODE_MARGINREQUIRED)<=0 && company()) MARGINREQUIRED=iClose(Symbol(),Period(),0)*0.005;

      // определяем возможность открытия встречных ордеров
      double margininit=MarketInfo(Symbol(),MODE_MARGININIT);
      double marginhedget=MarketInfo(Symbol(),MODE_MARGINHEDGED);
      double marginfree=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
      if (marginfree>0 && (margininit>marginhedget || (margininit==0 && marginhedget==0)))
        {
         double buy_margin_1=0;    // 
         double sell_margin_1=0;   //
         double buy_margin_2=0;    // 
         double sell_margin_2=0;   //
         double buy_margin=0;    // 
         double sell_margin=0;   //
         for (int i=0; i<OrdersTotal(); i++)
           {
            if (OrderSymbol()==Symbol())
              {
               if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                 {
                  if (OrderType()==OP_BUY)
                    {
                     buy_margin_2=buy_margin_2+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
                     summa_lots_buy_2+=OrderLots();
                     buy_margin_1=buy_margin_1+NormalizeDouble(OrderLots()*(AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_BUY,5)),2);
                     summa_lots_buy_1+=OrderLots();
//                     buy_margin=buy_margin+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
//                     summa_lots_buy+=OrderLots();
Print (__LINE__,"  i=",i,"  buy_margin_1=",buy_margin_1,"  summa_lots_buy_1=",summa_lots_buy_1,"  buy_margin_2=",buy_margin_2,"  summa_lots_buy_2=",summa_lots_buy_2);
                    }
                  else if (OrderType()==OP_SELL)
                    {
                     sell_margin_2=sell_margin_2+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
                     summa_lots_sell_2+=OrderLots();
                     sell_margin_1=sell_margin_1+NormalizeDouble(OrderLots()*(AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_SELL,5)),2);
                     summa_lots_sell_1+=OrderLots();
//                     sell_margin=sell_margin+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
//                     summa_lots_sell+=OrderLots();
Print(__LINE__,"  i=",i,"  sell_margin_1=",sell_margin_1,"  summa_lots_sell_1=",summa_lots_sell_1,"  sell_margin_2=",sell_margin_2,"  summa_lots_sell_2=",summa_lots_sell_2);
                    }
                 }
              }
           }
        }

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

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


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

 
Eugeni Neumoin #:

Приведите сложные формулы. Скрипт хотя бы свой. Я свой код выложил. Хотелось бы посмотреть Ваш. И проверить его. Чтобы без перехода на личности. А только голые факты.

У вас есть ссылка на тему где это писалось и проверялось. Читайте, фильтруйте, копируйте коды.

 
Artyom Trishkin #:
На форуме здесь никто Вам ничем не обязан. Равно, как и Вы никому. 
Про Алексея могу сказать: код он Вам вряд ли покажет. Почему? SSD у него сдох. По этой же причине он и мне не смог помочь в одном моëм вопросе. За это я его не посчитал (кем Вы его там собрались считать?) А в чëм разница? В людях. 
... А ветку, указанную Алексеем, таки почитайте. Там есть информация же. 

Самое хреновое в этой истории то, что в сервисе обещали восстановить всё что получится, а гарантийный отдел ситилинка просто передали только SSD, а флешку куда надо было всё скинуть просто оставили на полке.

 
Alexey Viktorov #:

Самое хреновое в этой истории то, что в сервисе обещали восстановить всё что получится, а гарантийный отдел ситилинка просто передали только SSD, а флешку куда надо было всё скинуть просто оставили на полке.

Да, SSD - это беда. При всех своих достоинствах умирают они мгновенно и бессимптомно. Восстановить что-то очень проблематично.
Тут только резервное копирование спасает. То ли дело старые добрые HDD, осыпались медленно и предсказуемо. ))) 

 

Эксперимент.

Переменные немного поменял и также поменял распринтовку результатов.

Переменные:

      double MARGINREQUIRED=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
      double MARGINREQUIRED_2=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
      double MARGINREQUIRED_1=0;
      if (m_cFrame.Get_frame_buy_sell()) // позиции на покупку
        {
         MARGINREQUIRED_1=AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_BUY,5);
        }
      else
        {
         MARGINREQUIRED_1=AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_SELL,5);
        }
      double summa_MARGINREQUIRED_1=0, summa_MARGINREQUIRED_2=0; // переменные для суммирования маржи

Расчет переменных перед открытием ордеров:

if (m_cFrame.Get_frame_buy_sell()) // позиции на покупку
  {
   MARGINREQUIRED_1=AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_BUY,5);
  }
else
  {
   MARGINREQUIRED_1=AccountEquity()-AccountFreeMarginCheck(Symbol(),OP_SELL,5);
  }
MARGINREQUIRED_2=5*MarketInfo(Symbol(),MODE_MARGINREQUIRED);
summa_MARGINREQUIRED_1+=MARGINREQUIRED_1;
summa_MARGINREQUIRED_2+=MARGINREQUIRED_2;

Print(__LINE__,"  AccountEquity=",AccountEquity(),"  MARGINREQUIRED_1=",MARGINREQUIRED_1,"  MARGINREQUIRED_2=",MARGINREQUIRED_2,"  summa_MARGINREQUIRED_1=",summa_MARGINREQUIRED_1,"  summa_MARGINREQUIRED_2=",summa_MARGINREQUIRED_2);


Результат после открытия ордеров:

if (ticket>0)
{
 Print(__LINE__,"  AccountEquity=",AccountEquity(),"  AccountMargin=",AccountMargin());
}


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

-------------------------

Цель эксперимента.

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

Планируется проведение двух экспериментов.

Первый эксперимент состоит из двух частей.

В первой части будут открываться сделки с параметрами:

размер одного ордера - 5 лотов;

количество одновременно открываемых ордеров - 15;

установлен размер прибыли на одну сделку (на один ордер) - 200$;

комиссия не учитывается.

Не предполагается следования какой-либо стратегии торговли. И фактического получения прибыли.

Только учет залоговой маржи.

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

Это две независимые друг от друга части.

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

Сделки короткие. Поэтому надо успеть все провести до получения профита или стопа.

Короткие сделки предусмотрены потому, что именно на таких сделках и были выявлены проблемы, о которых здесь идет обсуждение.

Второй эксперимент будет проведен с учетом некоторых результатов первого эксперимента. О втором эксперименте подробнее перед его проведением..

Сначала на нейтральном счете проверю выше приведенные коды. Чтобы исключить ошибки.

Результаты экспериментов сообщу независимо нравятся они мне или нет.

 

Провел проверку кода.

Сделал следующие изменения.

По первой части первого эксперимента.

Для вывода расчета маржи до открытия ордера:

if (m_cFrame.Get_frame_buy_sell()) // позиции на покупку
  {
   MARGINREQUIRED_1=AccountFreeMargin()-AccountFreeMarginCheck(Symbol(),OP_BUY,5);
  }
else
  {
   MARGINREQUIRED_1=AccountFreeMargin()-AccountFreeMarginCheck(Symbol(),OP_SELL,5);
  }

....

Print(__LINE__,"  k=",k+1,"  AccountEquity=",AccountEquity(),"  MARGINREQUIRED_1=",MARGINREQUIRED_1,"  MARGINREQUIRED_2=",MARGINREQUIRED_2,"  summa_MARGINREQUIRED_1=",summa_MARGINREQUIRED_1,"  summa_MARGINREQUIRED_2=",summa_MARGINREQUIRED_2);

Для вывода результата после открытия ордера:

Print(__LINE__,"  k=",k,"  AccountFreeMargin=",DoubleToStr(AccountFreeMargin(),2),"  AccountMargin=",DoubleToStr(AccountMargin(),2));


По второй части первого эксперимента:

         for (int i=0; i<OrdersTotal(); i++)
           {
            if (OrderSymbol()==Symbol())
              {
               if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                 {
                  if (OrderType()==OP_BUY)
                    {
                     buy_margin_2=buy_margin_2+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
                     summa_lots_buy_2+=OrderLots();
                     buy_margin_1=buy_margin_1+NormalizeDouble(AccountFreeMargin()-AccountFreeMarginCheck(Symbol(),OP_BUY,5),2);
                     summa_lots_buy_1+=OrderLots();
//                     buy_margin=buy_margin+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
//                     summa_lots_buy+=OrderLots();
Print (__LINE__,"  i=",i,"  buy_margin_1=",buy_margin_1,"  summa_lots_buy_1=",summa_lots_buy_1,"  buy_margin_2=",buy_margin_2,"  summa_lots_buy_2=",summa_lots_buy_2);
                    }
                  else if (OrderType()==OP_SELL)
                    {
                     sell_margin_2=sell_margin_2+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
                     summa_lots_sell_2+=OrderLots();
                     sell_margin_1=sell_margin_1+NormalizeDouble(AccountFreeMargin()-AccountFreeMarginCheck(Symbol(),OP_SELL,5),2);
                     summa_lots_sell_1+=OrderLots();
//                     sell_margin=sell_margin+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
//                     summa_lots_sell+=OrderLots();
Print(__LINE__,"  i=",i,"  sell_margin_1=",sell_margin_1,"  summa_lots_sell_1=",summa_lots_sell_1,"  sell_margin_2=",sell_margin_2,"  summa_lots_sell_2=",summa_lots_sell_2);
                    }
                 }
              }
           }