[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 271

 
hoz:

Понимаю, что там. Но не понятно почему реализовано именно так..

Каждая отдельная функция библиотеки - это часть целого, а отдельная библиотека - это часть всего комплекса моих библиотек - без этого осознания понять код не возможно.

hoz:

В исходном виде всё-равно не получится пользоваться Вашими библиотеками, т.е. у Вас там всё повязано. Каждая функция на пачке других..

И здесь Вы не правы. Вы когда-нибудь задумывались о структуре "среднестатистического" советника? Индивидуальность советнику придают условия стратегии (т.е. условия входа\выхода), а всё остальное это стандартный код. Как я создаю советники, в том числе и по заказам: беру шаблон (может служить, например, SAR, если нужен сетевой советник) и подсоединяю к нему дополнительную библиотеку, в которой прописаны условия новой стратегии (её я создаю заново).

hoz:

Я, ни в коем случае, не хотел проверять.. Даже более того, сомнений нет, что написано всё очень грамотно. Просто я не совсем всё понимаю, поэтому и сказал, что я думаю, не совсем так.. Смотрю, думаю.. НО не всё понимаю. Вот и спросил.

P.S. С  bs_Symbol я так и не понял.

Чтобы осознать реализацию, нужно понять исходные данные. Библиотеки создавались с возможностью работы с любым инструментом (Форекс) и, как в моно, так и в мультивалютном режиме, отсюда и введена глобальная переменная bs_Symbol, которая содержит значение текущего инструмента.
 
IIya:

Друзья! Нужна помощь в доработке советника.

Имеется программный код, который при определённом условии if открывает ордер. Исполнение условия может происходить каждый тик, так как помещён в теле int start().

Нужно:

1. После выполнения условия (и открытия ордера) сделать паузу на открытие новых ордеров, пауза n баров. Например если советник стоит на таймфрейме М30 и мне нужно пропустить 3 часа, то пауза должна быть 6 баров.

2. Программа должна работать в тестере стратегий.

Какой нужен код. И куда будет правильнее его вставить.

Вам в помощь функция iBarShift(). Сначала нужно узнать время открытия последнего ордера и передать в эту функцию, а затем отслеживать возвращаемое этой функцией значение, сравнивая с каким-то числом (в Вашем случае с 6).
 
TarasBY:
Вам в помощь функция iBarShift(). Сначала нужно узнать время открытия последнего ордера и передать в эту функцию, а затем отслеживать возвращаемое этой функцией значение, сравнивая с каким-то числом (в Вашем случае с 6).

Давайте разбираться вместе )

Передаём функции время открытия последнего ордера, и получаем возвращаемое число. Это примерно:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

Окей получили номер бара. А как теперь сделать паузу для открытия ордеров на 6 баров?

 
IIya:

Давайте разбираться вместе )

Передаём функции время открытия последнего ордера, и получаем возвращаемое число это примерно:

Окей получили номер бара. А как теперь сделать паузу для открытия ордеров на 6 баров?

Вот это неграмотный подход:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Но, так как к данному делу напрямую не относится, просто не акцентируем внимание. А схема выглядит так:

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
Явных ошибок в логике не видно. Принтуйте код пошагово. Процедура торговли завязана на значение переменной ticket. В первую очередь отследите её изменения. А также обратите внимание на значение глобальной переменной терминала "TRADECONTEXT" - её значение должно быть равно 0.

Спасибо! Вот только я ваще ни чего не понял(((, как слепой котенок я в этих кодах(((... 
 
al7bar:

Спасибо! Вот только я ваще ни чего не понял(((, как слепой котенок я в этих кодах(((... 
Оказывается Вы не автор данного кода. Тогда проще обратиться к автору.
 
TarasBY:

Каждая отдельная функция библиотеки - это часть целого, а отдельная библиотека - это часть всего комплекса моих библиотек - без этого осознания понять код не возможно.

  Я и пытаюсь осознать, и, попутно натыкаюсь на разные нюансы. Вот поэтому и спрашиваю Вас, т.к. Вам виднее. Вы же автор...

 

TarasBY:

И здесь Вы не правы. Вы когда-нибудь задумывались о структуре "среднестатистического" советника? Индивидуальность советнику придают условия стратегии (т.е. условия входа\выхода), а всё остальное это стандартный код. Как я создаю советники, в том числе и по заказам: беру шаблон (может служить, например, SAR, если нужен сетевой советник) и подсоединяю к нему дополнительную библиотеку, в которой прописаны условия новой стратегии (её я создаю заново).

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

 

TarasBY:

Чтобы осознать реализацию, нужно понять исходные данные. Библиотеки создавались с возможностью работы с любым инструментом (Форекс) и, как в моно, так и в мультивалютном режиме, отсюда и введена глобальная переменная bs_Symbol, которая содержит значение текущего инструмента.

 И где эта переменная задана явно, если не секрет? :) Я в библиотеке b-PSI@Base.mqh вижу что она только лишь объявлена:

 bs_Symbol,                            // текущий инструмент

 Но дальше ничего нет по сути. Да и вообще, значение текущего инструмента вообще по дефолту возвращается через Symbol(). Тогда зачем тут переменная?

 
TarasBY:

Вот это неграмотный подход:

Но, так как к данному делу напрямую не относится, просто не акцентируем внимание. А схема выглядит так:

Теперь наш код работает. В моём исполнении получилось так:
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:) Вот только если его внедрить в советник в том виде что сейчас, то всё начинает работать не корректно.

Как я понимаю из-за этой записи:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Что не так?

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

:) Вот только если его внедрить в советник в том виде что сейчас, то всё начинает работать не корректно.

Как я понимаю из-за этой записи:

Что не так?

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

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}