Ошибки, баги, вопросы - страница 3212

 
Ilyas #:

Увеличил внутренний буфер копирования в Clipboard с 256 до 4096 символов

Спасибо

 
Ilyas #:

Предоставьте пожалуйста код для воспроизведения ошибки

Надеюсь понятно что я хочу делать:  вместо OnTick(), использовать массив тиков от CopyTicks()

Я так понял такое решение  ошибочно, из-за текущей цены, также из-за текущей времени. Получается функция Buy() без OnTick() не сможет работать ?


#include<Trade\Trade.mqh>
   CTrade  trade;
   MqlTick tick[];
   double ASK;
   int itick, ktick;
   datetime timetick;
   datetime time=D'2022.06.04 06:32:31';
   
void OnInit()
{
  LoadTick();
}
void BUY()
{         
      Print("------------------------------------------------------------------");
      Print("itick=",itick, "    Ask=",ASK, "    timetick=",timetick);
      Print("------------------------------------------------------------------");
              
   if ( trade.Buy(0.1, _Symbol, ASK, 0, 0) )
   {
      bool selected=PositionSelect(_Symbol);
      if(selected) 
      {
      Print("==================================================================");
      Print("price=",PositionGetDouble(POSITION_PRICE_OPEN), "    time=",TimeToString(PositionGetInteger(POSITION_TIME)) );
      }
    }
}
void LoadTick()
{ 
    datetime start; 
    datetime   end=TimeCurrent();
        
    start=end-10*24*3600; 
    Print("Start=",start, " end=",end);
     
    ktick=CopyTicksRange(_Symbol, tick, COPY_TICKS_INFO, start*1000, end*1000);

    for( itick=0; itick<ktick; itick++)
    {
       ASK=tick[itick].ask;  timetick=tick[itick].time; 
       Sleep(1);   // Цена открытия ордера меняется, если меняем значение Sleep.
        
      if (timetick==time) { BUY(); break; }
    }
 }


2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   ------------------------------------------------------------------
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   itick=1241124    Ask=29631.43    timetick=2022.06.04 06:32:31
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   ------------------------------------------------------------------
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   market buy 0.1 BTCUSD (29223.69 / 29247.56)
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   deal #2 buy 0.1 BTCUSD at 29247.56 done (based on order #2)
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   deal performed [#2 buy 0.1 BTCUSD at 29247.56]
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   order performed buy 0.1 at 29247.56 [#2 buy 0.1 BTCUSD at 29247.56]
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   CTrade::OrderSend: market buy 0.10 BTCUSD [done at 29247.56]
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   ==================================================================
2022.07.06 10:57:55.184	Core 1	2022.06.11 00:20:41   price=29247.56    time=2022.06.11 00:20
2022.07.06 10:57:55.184	Core 1	2022.06.11 23:59:58   position closed due end of test at 28452.45 [#2 buy 0.1 BTCUSD 29247.56]



 
Petros Shatakhtsyan #:

Надеюсь понятно что я хочу делать:  вместо OnTick(), использовать массив тиков от CopyTicks()

Я так понял такое решение  ошибочно, из-за текущей цены, также из-за текущей времени. Получается функция Buy() без OnTick() не сможет работать ?




У Вас очень странный код. Вы пытаетесь совершить покупку по цене, которая была у тика попавшего на

D'2022.06.04 06:32:31'

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

 
PapaYozh #:

У Вас очень странный код. Вы пытаетесь совершить покупку по цене, которая была у тика попавшего на

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

Я не говорил, что это правильный код. Надо еще каким то образом установить "текущее время", т.е. время открытия ордера.

 
Petros Shatakhtsyan #:

Я не говорил, что это правильный код. Надо еще каким то образом установить "текущее время", т.е. время открытия ордера.

Если цена, по которой Вы пытаетесь купить, отличается от текущей цены Ask, то покупка не состоится. А цена, которую Вы извлекаете из прошлых тиков не обязана совпадать с текущей ценой.

Именно это я пытался сообщить Вам.

 
PapaYozh #:

Если цена, по которой Вы пытаетесь купить, отличается от текущей цены Ask, то покупка не состоится. А цена, которую Вы извлекаете из прошлых тиков не обязана совпадать с текущей ценой.

Именно это я пытался сообщить Вам.

У нас же текущей цены и времени нету. Они берутся из структуры тика MqlTick.

 
Petros Shatakhtsyan #:

У нас же текущей цены и времени нету. Они берутся из структуры тика MqlTick.

Только та структура из которой берутся данные в Вашем коде, содержит устаревшие данные.
 
Используйте SymbolInfoTick(...) для получения актуальных данных.
 
Petros Shatakhtsyan #:

Надеюсь понятно что я хочу делать:  вместо OnTick(), использовать массив тиков от CopyTicks()

Я так понял такое решение  ошибочно, из-за текущей цены, также из-за текущей времени. Получается функция Buy() без OnTick() не сможет работать ?

У Вас же исполнение по рынку, пока ордер дошёл до исполнения - цена "убежала"

 
Ilyas #:

У Вас же исполнение по рынку, пока ордер дошёл до исполнения - цена "убежала"

Вот именно.

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

Надо было также сделать синхронизацию потоков, как например семафор.