Навигация по сайту
Реклама
Популярные статьи

Новости
{links1}
Трамп обвинил расследование по «российскому делу» в двойных стандартах

Президент США Дональд Трамп в твиттере обвинил расследование о "вмешательстве России" в президентские выбора США в 2016 году в двойных стандартах.

В Мексике прыжки футбольных фанатов вызвали землетрясение

Сейсмологи зафиксировали в Мехико землетрясение искусственной природы в момент, когда сборная Мексики забила гол в ворота Германии на чемпионате мира по футболу в России.

Матч Бразилия – Швейцария: Цубер сравнял счёт

Полузащитник сборной Швейцарии Стивен Цубер сравнял счёт в матче со сборной Бразилии на 50 минуте: 1:1, передает корреспондент ИА REGNUM.


{links2}
Счетчик

» » Как ограничить количество одновременно открытых позиций/отложенных ордеров Гид по интернет трейдингу форекс
Рекламный блок

Как ограничить количество одновременно открытых позиций/отложенных ордеров Гид по интернет трейдингу форекс Форекс

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

Дело в том, что если просто проверять количество позиций с помощью функции OrdersTotal() и сразу же открытие новой позиции, то в случае, когда эксперт прикреплен на графики разных периодов, но по одному и тому же инструменту, мы получим "лишние" открытые позиции. Чтобы избежать этого, надо использовать критические секции.

Функции Lock() и Unlock() я описывал в выпуске "Критическая секция": разграничение доступа к ресурсу".
 
//+------------------------------------------------------------------+
//| Lock()                                                        |
//|                                                                  |
//| Возвращает:                                                |
//|   0 - если "критическая секция" успешно        |
//|        заблокирована                                     |
//|   1 - в случае ошибки                                   |
//|   2 - эксперт остановлен                              |
//|   3 - по таймауту (слишком долго ждали)       |
//+------------------------------------------------------------------+
int Lock(string GlobVarName, int timeout = 0)
  {
    string critical_section = GlobVarName+"Lock"; 
    // проверим, существует ли переменная critical_section
    if (!GlobalVariableCheck(critical_section))
      {
       if (GetLastError()!=0) return(1);      
       // переменная не существует, создадим ее
       if (GlobalVariableSet(critical_section, -1.0)==0) return(1);
       // переменная создана
      }   
    int StartTime = GetTickCount();   
    // ждем "зеленового света"
    while (true)
      {
        // проверить, не загорелся ли "зеленый свет"
        if (GlobalVariableGet(critical_section)==-1.0)
          {
           // "зеленый свет" загорелся, зажигаем "красный свет"
           if (GlobalVariableSetOnCondition(critical_section, 1.0, -1.0)) return(0);          
           // нас опередили, поэтому ждем "зеленового света"
          }       
        // проверим, не остановлен ли эксперт
        if (IsStopped()) return(2);
        // таймаут не истек?
        if (timeout!=0)
          {
            if ((GetTickCount()-StartTime)>timeout*1000) return(3);
          }         
        // спим 0.1 секунды
        Sleep(100);
      }
  }
//+------------------------------------------------------------------+
//| Unlock()                                                     |
//|                                                                  |
//| Возвращает:                                                |
//|   0 - если "критическая секция" успешно        |
//|        разблокирована                                    |
//|   1 - в случае ошибки                                   |
//|   2 - эксперт остановлен                               |
//|   3 - по таймауту (слишком долго ждали)       |
//+------------------------------------------------------------------+
int Unlock(string GlobVarName, int timeout = 0)
  {
    string critical_section = GlobVarName+"Lock"; 
    // проверим, существует ли переменная critical_section
    if (!GlobalVariableCheck(critical_section))
      {
       if (GetLastError()!=0) return(1);      
       // переменная не существует, создадим ее
       if (GlobalVariableSet(critical_section, -1.0)==0) return(1);      
       // переменная создана, поэтому выходим
       return(-1.0);
      }     
    int StartTime = GetTickCount();   
    // бесконечный цикл
    while (true)
      {
        // пытаемся установить "зеленый свет"
        if (GlobalVariableSetOnCondition(critical_section, -1.0, 1.0)) return(0);
        // проверим, не остановлен ли эксперт
        if (IsStopped()) return(2);
        // таймаут не истек?
        if (timeout!=0)
          {
            if ((GetTickCount()-StartTime)>timeout*1000) return(3);
          }         
        // спим 0.1 секунды
        Sleep(100);
      }
  }
 

Для решения нашей задачи создадим дополнительно функции StartTrading() и StopTrading().

В функции StartTrading() последовательность действий такова:

  • Локируем критическую секцию, чтобы исключить одновременный доступ из нескольких экспертов к функции OrdersTotal() и для исключения одновременной торговли нескольких экспертов.
  • Если количество открытых позиций/ордеров меньше лимита, то возвращаем true.
  • Если количество открытых позиций/ордеров больше или равно лимиту, то пишем об этом в лог, разлокируем критичсекую секцию и возвращаем false.
Вот исходный код функции StartTrading():
 
bool StartTrading(int max_trades)
  {
    // залокируем критическую секцию
    if (Lock("MaxTrades")!=0) return(false);

    int open_trades = OrdersTotal();
   
    if (open_trades       return(true);
    else
      {
       Print("Уже открыто ", open_trades, " позиций");
       Unlock("MaxTrades");
       return(false);
      }
  }
 
В функции StopTrading() мы просто разлокируем критическую секцию:
 
void StopTrading()
  {
    Unlock("MaxTrades");
    return;
  }
 
 
 

Ключевые теги:        ,       ,      ,          , функции, количество, эксперт, переменная, позиций, открытых, методом, случае, позиции, critical_section, существует, проверим, секцию, просто, критическую, OrdersTotal и
 
Другие новости по теме:

  • Пример ограничения числа одновременно открытых позиций Гид по интернет тр ...
  • Глобальные массивы: функция DeleteItem() Гид по интернет трейдингу форекс
  • Исходный код функции сортировки методом пузырька Гид по интернет трейдинг ...
  • Глобальные массивы: функция Count() Гид по интернет трейдингу форекс
  • Глобальные массивы: функция GetItem() Гид по интернет трейдингу форекс
  • Глобальные массивы: функция AddItem() Гид по интернет трейдингу форекс
  • Глобальные массивы: функция SearchItem() Гид по интернет трейдингу форекс
  • Глобальные массивы: технология поиска Гид по интернет трейдингу форекс
  • Пример использования функции GlobalVariableSetOnCondition() Гид по интерн ...
  • GlobalVariableGet() - получение значения глобальной переменной Гид по инт ...


  • Добавление комментария
    Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Вставка ссылкиВставка защищенной ссылки Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера





    форекс начинающим | форекс обучение | видео форекс | книги форекс | уроки форекс | советники форекс | {links} Copyright © 2010 центовый форекс All Rights Reserved...........