Вот, столкнулся с такой особенностью: отличие серверного времени биржи и локального на компе.
Сразу после синхронизации на компе отличие около нуля (+-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);
trywhile(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ться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}
Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
Флаг сделайте. Как только прошла цена нужное кол-во пунктов, значение тру, иначе фалсе. И проверяйте её значение. Сбрасывайте на фалсе, если инет сделок.
С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
Artur Sm #: С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
Наверное проще время. При открытии сделки запомните время и потом сравнивайте с актуальным. Прошло или нет.
Здравствуйте всем! Хочу реализовать одну вещь. А именно что бы главным условием было то, что бы после открытия ордера цена должна пройти определенное количество пунктов в любую из сторон. А уже потом реагировать на другие условия. Для этого у меня есть функция определения цены по которой был открыт ордер. Она рабочая, я ее проверял через Commetnt(). Далее я пишу условие if((Bid>=(FindLastOrderPrice()+200*_Point)) || (Bid<=(FindLastOrderPrice()-200*Point)) {...}
Но хочется так что бы: цена должна пройти определенное количество пунктов, после чего даже если она вернtться назад то ордер уже все равно мог бы открываться по другим условиям. Короче я так понимаю что в условие должно быть обнуление после того как цена прошла заданные пункты. Как это сделать?
Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.
Нашёл вот такую вещь. Штука довольно приятная Благодарность создателю. Но хочется допилить.
Сюрприз начинается в функции
boolSearchTradingSignals(void)
там каким то образом double ma [] rsi [] превращаются в значения индикатора на текущий момент и вынести эти данные у меня никак не выходит я вижу это как добавить несколько строк в функцию. voidTrailing(constdoublestop_level)
с условиями
если у нас есть имеющиеся позиции и они в плюсе на столько то денег ( где мы количество ставим во внешние настройки) и получен противоположный сигнал
закрыть все текущие до нового бара.
Или можно такое условие добавить в самую нижнюю функцию поиска сигнала. Но у меня там не вышло. Ругается на повторение данных.
Да вот, заканчиваю написание коннектора. Думаю над тем как сократить время между отдачей торговой команды и получением реакции системы.
Вы сертифицировали свой коннектор? Какие были сложности?
Нет еще не сертифицировал, строительный сезон начался...
Вот, столкнулся с такой особенностью: отличие серверного времени биржи и локального на компе.
Сразу после синхронизации на компе отличие около нуля (+-5мс) потом уходит. Получается надо "забить" на локальное и использовать только серверное с биржи. У Вас как с этим? Или такая точность Вам не важна?
Мы же ведем торговлю по серверному времени, следовательно синхронизация нам вообще не нужна.
Я вообще не использую какое-либо время, а беру данные из таблицы session
state i4 Состояние сессии
и таблицы sys_events: Таблица событий для того чтобы расшифровать более точно что произошло....
С флагом попробую. Есть еще вопрос. А как сделать так, чтобы после открытия ордера отсчет был не на пункты, а на заданное количество баров которое должно пройти после открытия сделки?
Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.
Цена изменяется дискретно.
Рекомендую еще ограничить "определенное количество пунктов" значением сверху. Иначе, рано или поздно влетите на резкое изменение цены.
Цена изменяется дискретно.
https://www.mql5.com/ru/code/25084
Нашёл вот такую вещь. Штука довольно приятная Благодарность создателю. Но хочется допилить.
Сюрприз начинается в функции
bool SearchTradingSignals(void)
там каким то образом double ma [] rsi [] превращаются в значения индикатора на текущий момент и вынести эти данные у меня никак не выходит
я вижу это как добавить несколько строк в функцию. void Trailing(const double stop_level)
с условиями
если у нас есть имеющиеся позиции и они в плюсе на столько то денег ( где мы количество ставим во внешние настройки) и получен противоположный сигнал
закрыть все текущие до нового бара.
Или можно такое условие добавить в самую нижнюю функцию поиска сигнала. Но у меня там не вышло. Ругается на повторение данных.
как такое обойти?Добрый день, Дмитрий!
Закончился строительный сезон, собрался сертифицировать программу.
Как у Вас дела?