Нужна помощь профессионального программиста - страница 55

 
Dmitriy Skub #:

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

Вы сертифицировали свой коннектор? Какие были сложности?

Нет еще не сертифицировал, строительный сезон начался...

 
Dmitriy Skub #:

Вот, столкнулся с такой особенностью: отличие серверного времени биржи и локального на компе.


Сразу после синхронизации на компе отличие около нуля (+-5мс) потом уходит. Получается надо "забить" на локальное и использовать только серверное с биржи. У Вас как с этим? Или такая точность Вам не важна?

Мы же ведем торговлю по серверному времени, следовательно синхронизация нам вообще не нужна.

Я вообще не использую какое-либо время, а беру данные из таблицы session 

state i4 Состояние сессии

и таблицы  sys_events: Таблица событий для того чтобы расшифровать более точно что произошло....

  if(UData^.tName = 'FORTS_REFDATA_REPLsys_events') then
  begin
    Tx:= create_transaction(CGCntr.FStorage.DBase, kTxReadOnly);
    try
      Tx.init_child(Table, PAnsiChar('FORTS_REFDATA_REPLsys_events'));
      Cnt:= Table.get_size;
      if(Cnt > 0) then
      begin
        TableIter:= create_iterator(Table);
        try
          while(TableIter.is_valid()) do
          begin
            if(TableIter.init_child(Rec, PAnsiChar('sess_id')).get_int32(vi32) = true) then
            begin
              if(CGCntr.FStorage.FCurSessID = vi32) then
              begin
                if(TableIter.init_child(Rec, PAnsiChar('event_type')).get_int32(EvType) = true) then
                begin
                  if(EvType = 1) then
                    if(TableIter.init_child(Rec, PAnsiChar('message')).get_string(EvMess) = true) then
                      if(string(EvMess) = 'session_data_ready') then
                      begin
                        CGCntr.Storage.CreateHeaders();   // Create new headers
//--- Set experts Change data event ---
                        for Pair in CGCntr.Storage.ChDataEvents do
                        begin
                          if(CGCntr.Storage.ChDataEvents.TryGetValue(Pair.Key, FEvent) = true) then
                            FEvent.SetEvent;
                        end;
                        break;
                      end;
                end;
              end;
            end;
            next_iterator(TableIter);
          end;
        finally
          free_iterator(TableIter);
        end;
      end;
    finally
      free_transaction(Tx);
    end;
  end else
//--- Visual events ---


//--- Execute thread ---
  while(not Terminated) do
  begin
    Res:= WaitForMultipleObjects(NUM_EVENTS, @FEvents, false, INFINITE);
    case Res of
      WAIT_OBJECT_0: if(GetSession(FExpData) = true) then              // Session
      begin
        case ExpData.Session.state of
          0: begin                                                     // Mew Session set
               FMemoStr:= 'Новая сессия назначена. Загрузка данных...';
               Synchronize(UpdMemo);
             end;
          1: if(GetTickData(FPrimLeg, FSecLeg, FExpData) = true) then  // Tick
               OnTick();           // Сессия идет. Можно ставить и удалять заявки.
          2: begin
               FMemoStr:= 'Приостановка торгов по всем инструментам. Нельзя ставить заявки, но можно удалять.';
               Synchronize(UpdMemo);
          end;
          3: begin
               FMemoStr:= 'Сессия принудительно завершена. Нельзя ставить и удалять заявки.';
               Synchronize(UpdMemo);
          end;
          4: begin
               FMemoStr:= 'Сессия завершена по времени. Нельзя ставить и удалять заявки.';
               Synchronize(UpdMemo);
          end;
        end;
      end;
      WAIT_OBJECT_0 + 1: ;                                   // Order
      WAIT_OBJECT_0 + 2: ;                                   // MLOrder
 
    Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}  
  Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
 
Artur Sm #:
    Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}  
  Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
Флаг сделайте.  Как только прошла цена нужное кол-во пунктов,  значение тру, иначе фалсе.  И проверяйте её значение.  Сбрасывайте на фалсе, если инет сделок. 

 
  С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
 
Artur Sm #:
  С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
Наверное проще время. При открытии сделки запомните время и потом сравнивайте с актуальным. Прошло или нет. 
 
Artur Sm #:
    Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}  
  Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?

Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.

Цена изменяется дискретно.

 
Dmitriy Skub #:

Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.

Цена изменяется дискретно.

Не очень понял как ограничить?
 

https://www.mql5.com/ru/code/25084


Нашёл вот такую вещь. Штука довольно приятная Благодарность создателю. Но хочется допилить.

Сюрприз начинается в функции 

bool SearchTradingSignals(void)

там каким то образом double ma []  rsi [] превращаются в значения индикатора на текущий момент и вынести эти данные у меня никак не выходит
я вижу это как добавить несколько строк в функцию. void Trailing(const double stop_level)

с условиями 

если у нас есть имеющиеся позиции и они в плюсе на столько то денег ( где мы количество ставим во внешние настройки) и получен противоположный сигнал 

закрыть все текущие до нового бара.

Или можно такое условие добавить в самую нижнюю функцию поиска сигнала. Но у меня там не вышло. Ругается на повторение данных.

как такое обойти?
MA based RSI
MA based RSI
  • www.mql5.com
Стратегия на основе индикатора iMA (Moving Average), который рассчитывается по значениям индикатора iRSI (Relative Strength Index, RSI)
 

Добрый день, Дмитрий!

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

Как у Вас дела?