нет цены? - страница 2

 
Vita:

if(mo==MinutesOpen && so>=SecondsOpen && ho==HourOpen)
Судя по вашему коду, вы хотите выставить ордер точно в заданную минуту. Однако, если в эту минуту от сервера не приходил ни один тик на терминал, то следовательно, процедура int start()

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

Получается, что если ставить вручную ордер, то берется последний пришедший тик?

Если так, то как програмно реализовать выставление ордеров по последнему тику в заданное время?

 
maxtor:Получается, что если ставить вручную ордер, то берется последний пришедший тик? Если так, то как програмно реализовать выставление ордеров по последнему тику в заданное время?


Здесь поможет зацикленный скрипт.
 
Talex:


Здесь поможет зацикленный скрипт.


А подскажите где пример поглядеть

Типа вот этого правила?

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

Эту же идею можно успешно реализовать с помощью скрипта, то есть организовать бесконечный цикл в нём. Но скрипт не имеет настраиваемых переменных.

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

 
maxtor:
Vita:

if(mo==MinutesOpen && so>=SecondsOpen && ho==HourOpen)
Судя по вашему коду, вы хотите выставить ордер точно в заданную минуту. Однако, если в эту минуту от сервера не приходил ни один тик на терминал, то следовательно, процедура int start()

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

Получается, что если ставить вручную ордер, то берется последний пришедший тик?

Если так, то как програмно реализовать выставление ордеров по последнему тику в заданное время?



Получается, что если ставить вручную ордер, то берется последний пришедший тик? -->

Немного не так, выставляя ордер вручную вам либо нужна текущая цена и брокер вам её сообщит, либо не нужна, если это отложенный ордер. Тоже самое произойдет, если принудительно запустить процедуру start в вашу целевую минуту - эксперт получит цену и откроет ордер. Можно зациклить советник, как вам и посоветовали, но я воздерживаюсь от подобных трюков - не лежит душа. Новая цена, пришедшая даже после вашей целевой минуты меня бы удовлетворила.

Если так, то как програмно реализовать выставление ордеров по последнему тику в заданное время? -->
К сожалению, нельзя предсказать какой тик будет последний перед той минутой, в которой вы хотите выставить ордер. Возможно, что новой цены не будет в течение нескольких минут перед вашей целевой минутой. Увы, нет новой цены - нет тика - нет запуска start.
 
Vita:

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

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

Нужно взять последний уже пришедший тик 1 минуту-5 минут назад и выставить на основе этой цены два ордера в заданную минуту

 
maxtor:
Talex:


Здесь поможет зацикленный скрипт.


А подскажите где пример поглядеть

Типа вот этого правила?

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

Эту же идею можно успешно реализовать с помощью скрипта, то есть организовать бесконечный цикл в нём. Но скрипт не имеет настраиваемых переменных.

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

Делаете скрипт, не забывая в заголовке указать #property show_inputs , для установки переменных. В скрипте делаете конструкцию типа:

int start()
  {
    bool condition=true;
 
    while(condition)
    {
      if(проверяете совпадает ли текущее время, со временем уставонки позиции)
      {
        если совпадает, то открываем ордер. Не забыть обновить данные.
        устанавливаем condition=false;, т.к. нам скрипт больше не нужен
      }
      Sleep(1000); устанавливаем время задержки до следующей итерации 
    }
  }
 

Спасибо.

Пойду разбираться :-)

 

Геморой, однако :-)

Не поделитесь куском кода для примера?

 
maxtor:
Vita:

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

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

Нужно взять последний уже пришедший тик 1 минуту-5 минут назад и выставить на основе этой цены два ордера в заданную минуту


Да, точно. Это возможно. Необходимо только запустить start в нужный вам момент.
 
maxtor:

Геморой, однако :-)

Не поделитесь куском кода для примера?


Вот вам код, рабочий, только что проверил. Но учтите время(час, минута, секунда) надо выставлять локальное.

#property show_inputs
extern string   Cross="";
extern double   Lots;
extern int      Type;
extern double   sl;
extern double   tp;
extern int      HourOpen = 20;       
extern int      MinutesOpen = 10;
extern int      SecondsOpen = 30;
extern int      Slippage=3;
extern color    ArrowColor=CLR_NONE;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
    bool condition=true;
    int  ho, mo,  so;
    double openprice;
    
    while(condition)
    {
      mo=TimeMinute(TimeLocal()); 
      so=TimeSeconds(TimeLocal()); 
      ho=TimeHour(TimeLocal()); 
 
      if((mo==MinutesOpen) && (so>=SecondsOpen) && (ho==HourOpen))
      {
        RefreshRates();
        if(Type==0)openprice=Ask;
        if(Type==1)openprice=Bid;
        if(OrderSend(Cross,Type,Lots,openprice,Slippage,sl,tp,NULL,0,0,ArrowColor)==-1)
        Print("Ордер не открыт, произошла ошибка №",GetLastError());
        condition=false;
      }
      Sleep(1000);
    }
 
//----
   return(0);
  }