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

 
Igor Zakharov:

***

В данном роботе тестил возможность закрытия сеток по схеме: убыточная + прибыльная > Х , то закрыть обе (как правило, на разных символах).

***

Если знаете, что нужно закрыть именно эти две позиции, то лучше запомнить тикеты этих позиций и закрывать их пока не закроете (ВНИМАНИЕ: никаких while и Sleep - выдали приказы на закрытие, вышли из OnTick, проверили - есть ещё позиции с этими тикетами - если есть, то снова пытаемся закрыть и вышли из OnTick.)

 
Vladimir Karputov:

Если знаете, что нужно закрыть именно эти две позиции, то лучше запомнить тикеты этих позиций и закрывать их пока не закроете (ВНИМАНИЕ: никаких while и Sleep - выдали приказы на закрытие, вышли из OnTick, проверили - есть ещё позиции с этими тикетами - если есть, то снова пытаемся закрыть и вышли из OnTick.)

Ценная идея. Может так?: OnTick() формирует массив с тикетами и пытается закрыть один раз, а OnTimer() проверяет есть ли они ещё и закрывает, если есть.

Между тиками может быть несколько минут, поэтому передадим задачу таймеру
 
Igor Zakharov:

Ценная идея. Может так?: OnTick() формирует массив с тикетами и пытается закрыть один раз, а OnTimer() проверяет есть ли они ещё и закрывает, если есть.

Между тиками может быть несколько минут, поэтому передадим задачу таймеру

Я бы отказался от ВСЕХ while, Sleep and OnTimer для задачи закрытия позиций. Я бы делал так: выстрелил приказы на закрытие - вышел из OnTick, на следуующем тике проверка: если позиции с нужными тикетами ещё живы - снова выстрелить приказы на закрытие и так по кругу через взход/выход в onTick.

Логика такая: закрытие позиции - первоочередая задача, поэтому цикл закрытия в самом начале OnTick. А формирование массива тикетов закрытия может быть в любом месте OnTick - хоть в самом конце.


Igor Zakharov:

***

Между тиками может быть несколько минут, поэтому передадим задачу таймеру

Значит ничего не поделать - только ждать нового тика.

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Igor Zakharov:

OnTick() формирует массив с тикетами и пытается закрыть один раз, а OnTimer() проверяет есть ли они ещё и закрывает, если есть.

Еще вариант (для реала - самое то), запуск советника в виртуальном окружении (там идеальное исполнение), а в реале только синхронизация с виртуальным.

 
Vladimir Karputov:

Значит ничего не поделать - только ждать нового тика.

Если, например, произошел сбой в сети, то ждать следующего тика - упускать возможность закрытия.

 
fxsaber:

Если, например, произошел сбой в сети, то ждать следующего тика - упускать возможность закрытия.

Сбой сети == разрыв соединения имеется в виду? Ну так нет интернета, значит вообще ничего не закрыть ни открыть - какая же здесь упущенная возможность?

И вообще, если торговая система будет очень чувствительна к каждому чиху (разрыв там или ещё что) - то в топку такую торговую систему.

[Удален]  
В сторадж невозможно внести файл, в имени которого есть символ #. Это нормальное поведение или баг?
 

Если речь о FX, то там тики не сильно меняет цену (обычно). Но на других рынках ордер может серьёзно проскользнуть при потиковом подходе. Я все-таки за попытки между тиками - вреда не вижу, потенциальная польза - есть. 

Надо пробовать...

 
Гистерезис в действии... на примере работы неявного оператора копирования присваивания в структурах.

#define PRINT(x) Print(#x, ":", string(x))

struct MyArray{
   uchar data[];
};


void OnStart(){
   MyArray tmp_arr;
   
   MyArray huge_arr;
   ArrayResize(huge_arr.data, 1000);
   ArrayInitialize(huge_arr.data, 0x8);
   
   MyArray small_arr;
   ArrayResize(small_arr.data, 10);
   ArrayInitialize(small_arr.data, 0x1);
   
   
   tmp_arr = small_arr;
   Print("\r\nTest with small_arr");
   PRINT(ArraySize(tmp_arr.data));
   PRINT(tmp_arr.data[0]);
   PRINT(tmp_arr.data[ArraySize(tmp_arr.data)-1]);
   
   tmp_arr = huge_arr;
   Print("\r\nTest with huge_arr");
   PRINT(ArraySize(tmp_arr.data));
   PRINT(tmp_arr.data[0]);
   PRINT(tmp_arr.data[ArraySize(tmp_arr.data)-1]);
   
   tmp_arr = small_arr;
   Print("\r\nTest with small_arr");
   PRINT(ArraySize(tmp_arr.data));
   PRINT(tmp_arr.data[0]);
   PRINT(tmp_arr.data[ArraySize(tmp_arr.data)-1]);
}

Результат:
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   Test with small_arr
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   ArraySize(tmp_arr.data):10
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   tmp_arr.data[0]:1
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   tmp_arr.data[ArraySize(tmp_arr.data)-1]:1
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   Test with huge_arr
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   ArraySize(tmp_arr.data):1000
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   tmp_arr.data[0]:8
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   tmp_arr.data[ArraySize(tmp_arr.data)-1]:8
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   Test with small_arr
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   ArraySize(tmp_arr.data):1000
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   tmp_arr.data[0]:1
2019.05.03 14:29:14.005 Test_push (EURUSD,H1)   tmp_arr.data[ArraySize(tmp_arr.data)-1]:8
 
Sergey Dzyublik:
Гистерезис в действии... на примере работы неявного оператора копирования в структурах.

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