Проблема с тестером? - страница 2

 
Спасибо за ответ.

Во-первых, действительно, новый билд перестал воспроизводить баг номер 1 - для всех значений индикатора теперь есть сделки.
Во-вторых, по-прежнему, не все сделки совершаются. Я понимаю, что чужой код - потемки, но если можно, посмотрите, мне кажется, ошибка, все-таки у вас. Индикатор дает сигналы. Эксперт просто делает buy / sell по ним, никакой сложной логики. Тем не менее, две трети сигналов игнорируются. Как это проверить: отключаем оптимизацию, ставим параметр (единственный) равным 75, делаем "старт". Затем смотрим на сделки. Параллельно - на бары (+1 или -1) того же индикатора, прикрепленного к тому же окну. Валюта - EURUSD_H1.

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

С уважением,
Кварк

П.С. На всякий случай, вот последняя версия эксперта, на которой все это можно увидеть. Индикатор и библиотечный файл без изменений. Тестируем по OHLC.

#include "mylib.mq4"

extern double dZigzagSize;

// ------

datetime timePrev = 0;

double dInitAmount = 1000.0;
int nNumOfExperts = 5;		// To do: autocalculate number of active experts
int nSlip = 5;

double dProfit = 0;		// old: arrTotals
double dLotSize = 0.1;

double dStopLoss;
double dTrailingStop;
double dTakeProfit;

int nPending = -1;

bool bUseMm = false;
int nMagic = 0;
bool bReportDone = false;

bool bBuy = true;
bool bSell = true;

// ------

int init ()
{ 
	if(Symbol() == "EURUSD" && Period() == 60)
	{
		if(!IsTesting())
		{
			dZigzagSize = 75; // buy only?
			bSell = false;
		}
	
		nMagic = 76;
	}
	else if(Symbol() == "GBPCHF" && Period() == 60)
	{
		if(!IsTesting())
		{
			dZigzagSize = 235;	// buy and sell ?
		}
		
		nMagic = 77;
	}
	else if(Symbol() == "GBPUSD" && Period() == 60)
	{
		if(!IsTesting())
		{
			dZigzagSize = 75; // buy only?
			bSell = false;
		}
		
		nMagic = 78;
	}
	else if(Symbol() == "USDCAD" && Period() == 60)
	{
		if(!IsTesting())
		{
			dZigzagSize = 200; // sell only?
			bBuy = false;
		}
		
		nMagic = 79;
	}
	else if(Symbol() == "USDJPY" && Period() == 60)
	{
		if(!IsTesting())
		{
			dZigzagSize = 75; 
		}
		
		nMagic = 80;
	}

	dStopLoss = dZigzagSize * Point;
	dTrailingStop = dZigzagSize * Point;
	dTakeProfit = 0;
	
	return(0);
}
//////////////////
int deinit()
{
	return(0);
}
////////////////////
int start()
{
	if(AccountFreeMargin() < 500)
		return(0);
		
	Report("Zigzag", nMagic, bReportDone);

	bool bIsBarEnd = false;
	if(timePrev != Time[0]) 
		bIsBarEnd = true;
	timePrev = Time[0];

	// ------

	int nSignal = iCustom(NULL, 0, "_Zigzag_Ind", dZigzagSize, 0, 1);
	
//Alert(nSignal);	

	dProfit = 0;
		
	for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);
		if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
		{
			dProfit += OrderProfit();
		}
	}   

	int nNumOfOpenedOrders = 0;
	
	for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
		if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol())
		{
			if(OrderType() <= OP_SELL)
				nNumOfOpenedOrders++;
		}
	}

	if(!nNumOfOpenedOrders)
	{
		if(bBuy && (nSignal == -1 || nPending == OP_BUY))
		{
			dLotSize = GetLotSize();

			OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, 
				Ask - dStopLoss, 0, "Zigzag", nMagic, 0, Aqua);
				
			nPending = -1;
			
			return(0);
		}
		else if(bSell && (nSignal == 1 || nPending == OP_SELL))
		{
			dLotSize = GetLotSize();

			OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, 
				Bid + dStopLoss, 0, "Zigzag", nMagic, 0, OrangeRed);
				
			nPending = -1;
			
			return(0);
		}
	}
	else
	{
		for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
		{
			OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
			if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol())
			{
				int nMode = OrderType(); 
	
				if(nMode == OP_BUY && nSignal == 1)
				{
			 		OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
			 		nPending = OP_SELL;
			 		return(0);
				}
					
				if(nMode == OP_SELL && nSignal == -1)
				{		
					OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
					nPending = OP_BUY;
					return(0);
		    	}
			}
		}
	}

	// ------
	
	for(nCnt = 0; nCnt < OrdersTotal(); nCnt++)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
		if(OrderMagicNumber() == nMagic && OrderSymbol() == Symbol())
		{
			if(OrderType() == OP_BUY && Bid - OrderOpenPrice() > dTrailingStop) 
			{
				if(OrderStopLoss() < Bid - dTrailingStop)
				{
					OrderModify(OrderTicket(), OrderOpenPrice(), 
						Bid - dTrailingStop, OrderTakeProfit(), 0, Aqua);
					return(0);
				}
			}
			
			if(OrderType() == OP_SELL && OrderOpenPrice() - Ask > dTrailingStop)
			{
				if(OrderStopLoss() > Ask + dTrailingStop || OrderStopLoss() == 0)
				{
					OrderModify(OrderTicket(), OrderOpenPrice(), 
						Ask + dTrailingStop, OrderTakeProfit(), 0, OrangeRed);
					return(0);
				}
			}
		}
	}
	
	return(0);
}

// ------

double GetLotSize()
{
	double dLot = (0.1 * dInitAmount + 0.1 * dProfit) / 1000;
	
	// To do: what fraction of free margin should be used
	if(dLot * 2 * dInitAmount > AccountFreeMargin() / nNumOfExperts)
		dLot = AccountFreeMargin() / (2 * dInitAmount * nNumOfExperts);

	dLot = MathFloor(dLot * 10) / 10;
	
	if(dLot < 0.1)
		dLot = 0.1;

	return(dLot);
}

// ------



 
Я понимаю, что чужой код

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

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


Хорошо. Исследование (с Вашего разрешения, только первые несколько сигналов). Итак.
EURUSD_H1, тестирование по OHLC, начальная дата 15.11.2002, данные с сервера Альпари (у меня там демо счет).
Эксперт приведен в моем последнем посте, индикатор и "библиотека" - в первом посте этой ветки. Если Вам неохота использовать "библиотеку" - закомментируйте вызов функции Report. Результат от этого не изменится.

В "тестере" нажимаем "Expert Properties" и ставим dZigzagSize равным 75. Индикатор - простой зигзаг, при развороте цены на 75 пойнтов он даст сигнал.

Снимаем пометку с "Optimization". Нажимаем на Start. Одновременно (точнее, все-таки, немножко до :) прикрепляем к указанному графику наш индикатор. Таким способом мы сможем смотреть на его сигналы и сличать их со сделками, которые совершает эксперт. Кстати, жаль, что нельзя заставить тестер выставлять значки сделок, как было в вер. 3.

Результаты:

1 2002.12.02 17:00 buy 1 0.10 0.9945 0.9870 0.0000 0.00 0.00

Очень похоже на правду. Сделка совершена на баре, следующем за сигналом.

2 далее следует куча "modify" - пропускаем, они к обсуждению не относятся.

15 2002.12.11 02:00 s/l 1 0.10 1.0058 1.0058 0.0000 109.15 1109.15
16 2002.12.17 18:00 sell 2 0.10 1.0271 1.0346 0.0000 0.00 0.00

Пропущены сигналы:
2002.12.11 02:00 - должен был быть close, сработал s/l. Я не уверен, баг это или нет, так что игнорируем, но имеем в виду.
2002.12.12 10:00 - пропущен buy (сигнал есть на графике индикатора)
2002.12.13 18:00 - пропущен sell
2002.12.16 08:00 - пропущен buy

2002.12.17 17:00 - ну наконец-то, правильный сигнал.

Я не знаю, какой еще анализ надо предоставить, чтобы он был "техничным". Индикатор тупо шлет -1, 0, либо +1. Эксперт их должен также тупо отрабатывать. Он так и делает, но часть (!) пропускает.

Еще раз повторюсь, может быть это моя ошибка. В этом случае я ее просто не вижу. Уже неделю кручу этот эксперт в этом тестере.

Кварк.
 
Еще раз повторюсь, может быть это моя ошибка.

Попробуйте еще половить - вставьте отладочный вывод по максимуму.

Эксперт их должен также тупо

Просто тупо выводите промежуточные результаты.
А потом: анализ + опубликуйте результат.
 
OK
 
Еще раз повторюсь, может быть это моя ошибка.


Так и оказалось. Спасибо.
 
Вопрос: при тестировании по OHLC, что является ценой открытия? Будет ли это Open сдедующего бара?
 
А потом: анализ + опубликуйте результат.

Еще раз повторюсь, может быть это моя ошибка.
Так и оказалось. Спасибо.

В порядке обмена опытом, а где же была ошибка? Всем было бы интересно поучиться на чужих ошибках, чтобы не наступать на те же грабли!