Квантовый трейдинг

  • Автор темы Автор темы quants
  • Дата начала Дата начала

quants

Прохожий
Язык mql получил достаточно серьезные улучшения, чтобы можно было использовать его не только на уровне любителя, но и более менее профессионально.
До этого он был просто процедурным языком, сейчас же худо бедно поддерживает ООП, и что вполне приятно, худо бедно - классы.
Лично мне еще не хватает поддержки интерфейсов. Но буду надеяться, что они появятся, и тогда меня ждут долгие ночи рефакторинга кода.

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

quants

Прохожий
Писать буду редко, но метко (так как параллельно много дел, плюс все что буду тут писать, надо запрограммировать и подумать, что сделать следующим шагом).
Итак, первое, что нам надо запрограммировать, это обертку для открытия и закрытия ордеров. Дело в том, что не так сложно писать только OrderSend, но вот только каждое открытие и закрытие надо сопровождать проверками и обработками.
Да и упростить синтаксис написания тоже не повредит.
По мере необходимости, он будет обрастать нужными функциями, но на первое время нам нужны будут следующие:
Код:
Expand Collapse Copy
class OrdersHelper
{
	private:
		int magicNumber;
		int slipPage;
		string symbol;
		color buyOrderColor;
		color sellOrderColor;
		color modifyOrderColor;
		
	public:
		OrdersHelper(int inMagicNumber, int inSlipPage, string inSymbol);
		OrdersHelper(int inMagicNumber, int inSlipPage);
		void SetColorOrders(color inBuyOrderColor, color inSellOrderColor, color inModifyOrderColor);
		void SetDefaultColorOrders();
		int OpenOrder(int cmd, double lot, int sl, int tp, string comment);
		int OpenOrderBuy(double lot, int sl, int tp, string comment);
		int OpenOrderSell(double lot, int sl, int tp, string comment);
		bool CloseOrder(int ticket);
		bool DeleteOrder(int ticket);		
};
Немного поясню, symbol() можно было вынести, как у меня, в поле helper'а, а можно в методы. Но так как чаще всего я буду использовать стратегии для одной валютной пары, то мне нет необходимости каждый раз передавать ее в вызов метода.
Соответственно, в данной реализации, для использовании на нескольких парах, под каждую придется создавать "свой" экземпляр класса.
Также изначально нет раскраски действий. Можно задать "свою", либо цветами "по-умолчанию" - цвета которые использует МТ в тестере.
 

quants

Прохожий
Для простоты анализа фильтров и сигналов напишем два "полусоветника". Один открывает сделки с фиксированными тейком и стопом. Другой - по подсмотренным в соседней ветке "симплекс" методом, то есть с фиксированным тейком для группы ордеров, но с разными стопами.

Так мы сможем проверять "качество" фильтров и сигналов без прикручивания каких-либо фишек в стратегии. Ведь сигналы и фильтры должны быть однозначными и давать хоть какое-то преимущество на рынке.

Условно, у нас появляются еще два очень похожих друг на друга класса

Код:
Expand Collapse Copy
class OpenOrdersFixStopProfit
{
	private:
		int stopLoss;
		int takeProfit;
		int magicNumber;
		int slipPage;
		
		OrdersHelper *ordersHelper;
		void ProcessBuy(double lot);
		void ProcessSell(double lot);
	public:
		OpenOrdersFixStopProfit(int inMagicNumber, int inSlipPage, int inStopLoss, int inTakeProfit);
		void ProcessSignal(int signal, double lot = 0.1);
};
и
Код:
Expand Collapse Copy
class OpenOrdersSimplexMethod
{
	private:
		int stopLoss;
		int simplexCount;
		int magicNumber;
		int slipPage;
		
		OrdersHelper *ordersHelper;
		void ProcessBuy(double lot);
		void ProcessSell(double lot);
	public:
		OpenOrdersSimplexMethod(int inMagicNumber, int inSlipPage, int inStopLoss, int inSimplexCount);
		void ProcessSignal(int signal, double lot = 0.1);
};
 

quants

Прохожий
А теперь немного подогреем публику :)
В соседней ветке продается робот не то за 1000 уе, не то за 250 уе.
Цена гуляет, как и прибыльность робота.
Так вот.
По его первой версии не сложно понять, что "фильтром" является направление дневной свечи ("старшую" свечу можно задать в параметрах советника,если есть желание)
Код:
Expand Collapse Copy
int GetFilter(int shift) 
{
	int result = 0;
	int dayShift = iBarShift(Symbol(), PERIOD_D1, Time[shift]) + 1;
	if(iOpen(Symbol(), PERIOD_D1, dayShift) > iClose(Symbol(), PERIOD_D1, dayShift))
	{
		result = -1;
	}
	if(iOpen(Symbol(), PERIOD_D1, dayShift) < iClose(Symbol(), PERIOD_D1, dayShift))
	{
		result = 1;
	}
	return(result);
}
А сигналом для входа - направление свечи на более мелком таймфрейме
Код:
Expand Collapse Copy
int GetSignal(int shift)
{
	int result = 0;
	if(Open[shift] > Close[shift])
		result = -1;
	if(Open[shift] < Close[shift])
		result = 1;		
	return(result);
}
В данном случае сигнал "обратные", но реверс сигнала мы обработаем чуть позднее. По сути - в данном случае сигнал: бычья свеча для покупок, медвежья для продаж.
У автора он инверсионный.

Под конец еще поделюсь еще одной стандартной оберткой в советнике.
А именно, как правило, надо различать - новая свеча у нас, или просто, новый тик. Так как сигналы как правило генерируются при закрытии свечи, а "сопровождение" сделок необходимо проводить каждый тик.
Таким образом, получаем такую симпатичную обертку:
Код:
Expand Collapse Copy
void OnTick()
{
//---
	if(_lastCandle != Time[0])
	{
		NewCandle();
		_lastCandle = Time[0];
	}   
	NewTick();
}

Так как автор советника никаких рекомендаций не дает, можно сделать простые выводы.
Советник должен работать по каждой паре независимо также неплохо.
С той лишь разницей, что чем больше пар в работе, тем больше диверсификация и меньше риск слива.
Соответственно, поэтому у автора в новой версии уже, если не ошибаюсь, 5 пар в работе.

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

Далее покажу более аргументированно, почему не стоит покупать этот робот, по крайней мере в текущем состоянии.
А также, возможно, покажу, как небольшие изменение принесут потенциал роботу (не очень хочется, чтобы автор взял на вооружение, и стал продавать свой супер пупер робот 3й версии, более устойчивый к сливам, но уже за 2000 уе :angry:)
 
Верх