Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#5426

Предлагаю (прошу) сделать обзор/описание библиотеки MT4Orders. В ней действительно реализованы механизмы мультиплатформенности.

#5427

Всем здравствуйте! Помогите пожалуйста, не пойму ошибку!

Снимок_экрана_1.png

#5428

Попробуйте объявить режим строгой проверки ошибок:

#property strict
#5429


Всем здравствуйте! Помогите пожалуйста, не пойму ошибку!


Тестер говорит что переменная уже глобально объявлена выше.
#5430

Из лички.

Цитата


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


1.) Привет. Всегда проверяй какие данные поставляет тебе источник. iCustom.mq4 и тестер индикаторов тебе в помощь.
Источник нам дает 0 как отсутствие сигнала и 1,3254 как сигнал.

2.)
if(EMA_Hone != EMPTY_VALUE && EMA_Htwo != EMPTY_VALUE)

0 равен EMPTY_VALUE(2147483647)? нет!
1,3254 равен EMPTY_VALUE(2147483647)? нет! Такое условие всегда будет верным и пропускать.

исправляем на
if(EMA_Hone != 0 && EMA_Htwo != 0)

Работает.

Да! этот индикатор есть скользящая средняя, сглаживание EMA по ценам CLOSE.

iCustom.mq44 скач.

Изменено 14 февраля, 2019 пользователем MikR0ReR

#5431

Здравствуйте.
При тестировании своего советника в тестере стратегий у меня возникло недопонимание одного момента со спредом.
Например, для ордера Buy я рассчитываю SL в советнике по формуле
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
При проверке на демо-счете все работает корректно при закрытие сделки по стопу. А при проверке в тестере убыток увеличиваетя на размер некого фиксированного спреда. Причем настройки в поле "Спред" в тестере ничего не дают, результат не меняется.
Аналогично фин. результат сделки при закрытии по TP так же отличается на Демо и в тестере на тотже самьй спред.
Я не так давно пользуюсь тестером.
Подскажите, пожалуйста, что я делаю не так?

#5432

Подскажите, пожалуйста, что я делаю не так?


Попробуй как вариант модифицировать ордер уже после открытия. На ECN типе счетов выставлять ТП/СЛ сразу нельзя, насколько я помню.
Т.е. уже после открытия ордера бери цену его открытия от нее выставляй цели:
            int ticket = (int)OrderSend(_Symbol, op, Lot, Ask, slippage, 0, 0, EAName, MagicNumber, 0, clrBlue);
if(ticket else {
if(OrderSelect(ticket,SELECT_BY_TICKET) {
double tp = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits);
double sl = NormalizeDouble(OrderOpenPrice() - StopLoss*Point, Digits);
if(!OrderModify(ticket, OrderOpenPrice(), sl, tp, 0)) Print("Ошибка модификации ордера");
}
}


Возможно у тебя разница до целей возникает из-за проскальзывания и времени между выставлением ордера и модификацией - вначале Ask был один, потом стал другой.
#5433

проблема с CountSell().
подсчет открытых позиций на реале порой дает сбой. "успевает" открыть две позиции в место одной. может конечно на оборот и "не успевает" просчитать, но думаю ошибка в чем то этаком.
подскажите пожалуйста как стабилизировать эту функцию:
int CountSell()
{
int count = 0;
for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic &&
OrderType()==OP_SELL)
count++;
}}
return(count) ;
}

#5434

проблема с CountSell().
подсчет открытых позиций на реале порой дает сбой. "успевает" открыть две позиции в место одной

Проблема не в функции, а в общей логике.
#5435

Попробуй как вариант модифицировать ордер уже после открытия. На ECN типе счетов выставлять ТП/СЛ сразу нельзя, насколько я помню.
Возможно у тебя разница до целей возникает из-за проскальзывания и времени между выставлением ордера и модификацией - вначале Ask был один, потом стал другой.




Я так и делаю с модификацией.
И на демо все работает четко. SL выставляется ровно 10 пунктов, убыток при лоте 0.1 - 10$.
Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.
Вопросы:
Так и должно быть?
Как убрать этот спред? Я меняю его в настойках тестера в поле "спред", но ничего не менется, убыток по прежнему 10,5 при любом значении в поле "спред".


Кстати таже история, когда запускаю учебные советники из курса

Изменено 15 февраля, 2019 пользователем Larcher

#5436

"Как убрать этот спред? Я меняю его в настойках тестера в поле "спред", но ничего не менется, убыток по прежнему 10,5 при любом значении в поле "спред"."

- а ты, именно ноль вписывал в окне спреда?
- имею другой вопрос к TralingStop:
параметр шаг/step начинается только после достижения без убытка заданного параметром stoploss. то есть первый step = размеру stoploss.
- а хотелось бы что бы TralingStop сразу начинался по заданному шагу.
- как?

#5437

Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.

Возможно из-за другой стоимости пункта - зависит от валюты счёта и валют пары теста. Проверьте комиссию. Демо и тестер на одном счёте?

имею другой вопрос к TralingStop:
параметр шаг/step начинается только после достижения без убытка заданного параметром stoploss. то есть первый step = размеру stoploss.
- а хотелось бы что бы TralingStop сразу начинался по заданному шагу.

Трал может включаться сразу после открытия ордера или некого уровня просадки - вопрос алгоритма. Вы готовы заранее задать условие включения трала если сделка ушла в минус на 10$ или на 20$? Поэтому проще определить БУ ордера как точку срабатывания условия включения трала.
#5438


Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.

Возможно из-за другой стоимости пункта - зависит от валюты счёта и валют пары теста. Проверьте комиссию. Демо и тестер на одном счёте?

Спасибо. Разобралась) Это не спред, а комиссия (счет ECN), я совсем про нее забыла ;) На демо финрезультат и комиссия показываются отдельно, а в тестере они суммируются.

Изменено 18 февраля, 2019 пользователем 0ll

#5439

Вы готовы заранее задать условие включения трала если сделка ушла в минус на 10$ или на 20$?


ну скажем так, я хотел бы попробовать такое условия срабатывания трала(сразу). запустить на тесте и проверить. потом поразмышлять над результатом.
я так понимаю речь идет об изменении этого условия:
...
if(OrderStopLoss() {
if(!OrderModify...

подскажите алгоритм для включения трала в роботу сразу после открытия ордера.
#5440

я так понимаю речь идет об изменении этого условия:

Нет, это условие перестановки СЛ. Включается трал в месте вызова функции.
Алгоритм простой: если есть рыночные ордера - вызываем функцию для каждого.
#5441

Новый урок:
http://tradelikeapro.ru/mql4-raschet-stat-koeffitsientov/

#5442

Включается трал в месте вызова функции.


в месте вызова, какой функции:OrderModify(), или там где запускаетсяTrailing() ?

Изменено 19 февраля, 2019 пользователем Ar4i

#5443

функции трала. Ar4i Вы свой код показываете кусочками и хотите помощи...

#5444

функции трала. Ar4i Вы свой код показываете кусочками и хотите помощи...


понял. исправляюсь:
Спойлер

//----------------------
void Trailing()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == Symbol() &&
OrderMagicNumber()== Magic)
{
//--------------------
if(OrderType() == OP_BUY)
{
last_type = OP_BUY;

if(Bid-OrderOpenPrice() > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() {
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits);
if(!OrderModifyX(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TralingStop *Point, Digits), TP, 0, Red))
Print ("Trailing(): Ошибка! модификации ордера на buy");
}}}
//-----------------
if(OrderType() == OP_SELL)
{
last_type = OP_SELL;

if(OrderOpenPrice()-Ask > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() > Ask+(TralingStep + TralingStop)*Point || OrderStopLoss()==0)
{
TP = NormalizeDouble(OrderOpenPrice() - TakeProfit *Point, Digits);
if(!OrderModifyX(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TralingStop *Point, Digits), TP, 0, Red))
Print ("Trailing(): Ошибка! модификации ордера на sell");
}}}
} // if(OrderSelect..

}// for..

} //end
//----------------------


ну и уже соответственно в нужном мне контексте вставляю: Trailing().

Изменено 20 февраля, 2019 пользователем 0ll

#5445

понял. исправляюсь:
ну и уже соответственно в нужном мне контексте вставляю: Trailing().

fcplm я и веду речь о том, что не вижу кода места вызова функции Trailing(). Там должно условие какое-то быть...
#5446

if(PriceHigh_2 >= PriceHigh)
{

//-----------------------------close sell
if(CountSell() > 0)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderMagicNumber() == Magic && OrderType()== OP_SELL)
if(OrderClose(OrderTicket(), OrderLots(), Ask, Slippadge, Black )== true)
Print("Закрытие на sell №" + IntegerToString(OrderTicket(), 1, ' '));

}}}
//-------------------------------open buy
if(CountSell()==0 && CountBay()==0 && last_type != OP_BUY)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippadge, 0, 0,"OrderSend", Magic, Blue);
if(ticket > 0)
{
Print("Открытие сделки №" + IntegerToString(aticket, 1, ' '));
} else Print("error of opening order on buy");
}
Trailing();
}
//-------------------------------------------------------
правда не понимаю какое значение это может имеет к самому интересующему меня моменту алгоритма самой функции Trailing().

Изменено 21 февраля, 2019 пользователем Ar4i

#5447

правда не понимаю какое значение это может имеет к самому интересующему меня моменту алгоритма самой функции Trailing().

У Вас Трал включается только при условии на вход, т.е. максимум 1 раз за свечу - поэтому не работает.
#5448

изменил но суть та же.

#5449

изменил но суть та же.

В разведке служите? В чём суть-то?
#5450

В чём суть-то?


есть функция:
Спойлер

//----------------
void Trailing()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == Symbol() &&
OrderMagicNumber()== Magic)
{
if(OrderType() == OP_BUY)
{
last_type = OP_BUY;
if(Ask-OrderOpenPrice() > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() {
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit*Point, Digits);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask-TralingStop *Point, Digits), TP, 0, Red))
Print ("Ошибка! модификации ордера на buy");
}}}
if(OrderType() == OP_SELL)
{
last_type = OP_SELL;
if(OrderOpenPrice()-Bid > TralingStop *Point || OrderStopLoss()==0)
{
if(OrderStopLoss() > Bid+(TralingStep + TralingStop)*Point || OrderStopLoss()==0)
{
TP = NormalizeDouble(OrderOpenPrice() - TakeProfit *Point, Digits);
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid + TralingStop *Point, Digits), TP, 0, Red))
Print ( Ошибка! модификации ордера на sell");
}}}}}}

//----------------


в ней есть параметры TralingStop и TralingStep.
так вот, срабатывание заданного шага(TralingStep) в этой функции происходит ТОЛЬ ПОСЛЕ ПЕРВОГО ШАГА равному всегда TralingStop(линии без убытка), а уже последующие шаги совершаются равные TralingStep.
хочется получить, что бы ПЕРВЫЙ ШАГ был тоже равен TralingStep.

Изменено 25 февраля, 2019 пользователем 0ll

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025