Тестер лажает?

 

Драсьте! Есть такая ситуация: написал свой эксперт, пустил его на тестер, и выдаётся мне ошибка 130 - уровень стоплосс неверный. Порылся чуть-чуть на форуме, но ничего дельного не нашёл.

О себе. Ниже приведён шмат кода, который выдаёт ошибку.

cmd=1-OT_Buy;
curlots=Lot*(MathFloor(AccountBalance()/LotThreshold))/4;
if(curlots<MarketInfo(MySymbol,MODE_MINLOT))
curlots=MarketInfo(MySymbol,MODE_MINLOT);
if(curlots>MarketInfo(MySymbol,MODE_MAXLOT)/4)
curlots=MarketInfo(MySymbol,MODE_MAXLOT)/4;
if(curlots>0.5) curlots=0.5;
curlots=0.1;
TP=(1-OT_Buy)*(Bid-TakeProfit)+OT_Buy*(Ask+TakeProfit);
price=(1-OT_Buy)*Bid+OT_Buy*Ask;
TP=NormalizeDouble(TP,Digits);
price=NormalizeDouble(price,Digits);
slippage=MarketInfo(MySymbol,MODE_SPREAD);
ticket=OrderSend(MySymbol,OT_Buy,curlots,price,3,0,TP,"",magic,0);

TakeProfit - double = 0.00200;

MYSymbol = "EURUSD";

ТР = 1.3014;

price = 1.2914;

OT_Buy = e.g. 0;

magic = int.

При ошибке все параметры ордера выводятся через принт.


Как вы можете заметить, я даже зафиксировал все переменные определёнными значениями, но результат тот же. Провайдеры - Броко и Альпари.

Кстати будет добавить, что для каждого важного шага я реализовал вывод результатов в файл-лог. К сожалению, в лог выводится только данные отправленные за один сеанс открытия (открытие через команду filehandle=FileOpen(filename,FILE_READ|FILE_WRITE,' ');). Процедура такова: после каждого GetLastError() открываю файл через указанную команду, вывожу в файл парочку строк, затем FileFlush(filehandle); FileClose(filehandle);. Так вот в файле сохраняется только последние вызовы открытия/записи/закрытия, как будто filehandle=FileOpen(filename,FILE_WRITE,' ');. Конфуз!

Может быть в выходные, когда рынок закрыт так и должно быть %)?


Заранее глабодарю
 

Для баевых ордеров тэйкпрофит должен быть выше цены, а у Вас - ниже

 TP=(1-OT_Buy)*(Bid-TakeProfit)+OT_Buy*(Ask+TakeProfit);

и цена должна быть Аск, а не Бид

price=(1-OT_Buy)*Bid+OT_Buy*Ask; 

 
Roger:

Для баевых ордеров тэйкпрофит должен быть выше цены, а у Вас - ниже

TP=(1-OT_Buy)*(Bid-TakeProfit)+OT_Buy*(Ask+TakeProfit);

и цена должна быть Аск, а не Бид

price=(1-)*Bid+OT_Buy*Ask;



;)

Я Вас очень понимаю, но Вы же не знаете чему равен у меня OT_Buy.

Конкретно, результаты:

2010.07.24 20:51:10 2010.07.01 13:00 EURUSD,H1: Slippage: 2
2010.07.24 20:51:10 2010.07.01 13:00 EURUSD,H1: TakeProfit level: 1.24780000
2010.07.24 20:51:10 2010.07.01 13:00 EURUSD,H1: Price: 1.23380000
2010.07.24 20:51:10 2010.07.01 13:00 EURUSD,H1: Volume: 0.10000000

2010.07.24 20:51:10 2010.07.01 13:00 EURUSD,H1: Command: 0

2010.07.24 20:51:10 2010.07.01 13:00 EURUSD,H1: OrderSend error 130

(Провайдер Броко - суббота, вечер)

Сейчас буде правильно? :)

 
iMAG:


;)

Я Вас очень понимаю, но Вы же не знаете чему равен у меня OT_Buy.


Посмотрите первый пост

OT_Buy = e.g. 0; 

 
Roger:


Посмотрите первый пост

OT_Buy = e.g. 0;



Исполните виртуально на пальцах скриптик... :)
 
Прошу прощения за последний пост, - я просчитался. Однако, вопрос суть не меняется.
 

Вот строка

ticket=OrderSend(MySymbol,OT_Buy,curlots,price,3,0,TP,"",magic,0);

она будет бай, если  OT_Buy равна 0.

Или ставьте cmd. 

 
Roger:

Вот строка

ticket=OrderSend(MySymbol,OT_Buy,curlots,price,3,0,TP,"",magic,0); гд

она будет бай, если OT_Buy равна 0.

Или ставьте cmd.


Спасибо! Облажался. В самом деле, каждый раз путаюсь при составлении таких "хитроумных" выражений основанных на одной переменной. К тому же за время писания комментария, несколько раз менял код так, что сам запутался. Прошу прощения если показался заносчивым.

Вопрос решился положительно. Предлагаю вкратце выставить подобные вопросы в краткий ФАК где-то на видном месте. Специально для таких НУБов как я. :)

Однако, остался ещё один вопрос. По поводу вывода в текстовый файл. Моего опыта явно не хватает для решения, почему каждый раз когда я пытаюсь открыть через "filehandle=FileOpen(filename,FILE_READ|FILE_WRITE,' ');" получается как будто я отурывал "filehandle=FileOpen(filename,FILE_WRITE,' ');" (каждый раз переписывается по новой).

У кого есть опыт с такими заморочками, будьте добры, - подтолкните легонько в нужную сторону.

 

Дык все просто. Читайте справку по FileOpen(), там все расписано:

Если FILE_WRITE не комбинируется с FILE_READ, то будет открыт файл нулевой длины. Даже если до открытия в файле были данные, то они будут уничтожены. Если необходимо дописывать данные в существующий файл, то его нужно открывать, используя комбинацию FILE_READ | FILE_WRITE.
Если FILE_READ не комбинируется с FILE_WRITE, то файл будет открыт только в том случае, если он уже существует. Если файл не существует, то создать его можно, используя режим FILE_WRITE.

 

Если Вы открываете файл и сразу начинаете в него писать, то все что было до того сотрется. Поэтому надо открыть и найти конец текста.

 
Roger:

Если Вы открываете файл и сразу начинаете в него писать, то все что было до того сотрется. Поэтому надо открыть и найти конец текста.



???

Это как в ТурбоПаскале? Надо сделать while eof(filehandle) fileread(filehandle)?

Да уж... Документация и справка оставляют желать лучшего... :(

2Mathemat,

Читал ужо столько раз, что чуть ли не наизусть помню...

Причина обращения: