Предлагаю (прошу) сделать обзор/описание библиотеки MT4Orders. В ней действительно реализованы механизмы мультиплатформенности.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Всем здравствуйте! Помогите пожалуйста, не пойму ошибку!
Попробуйте объявить режим строгой проверки ошибок:
#property strict
Всем здравствуйте! Помогите пожалуйста, не пойму ошибку!
Тестер говорит что переменная уже глобально объявлена выше.
Из лички.
Цитата
Привет, ты мне помог очень, я ещё решил засунуть один индикатор, и тут у него немного другие показания, на покупку открывает и должен закрыть как только будет продажа, но получается что он выставляет ордера на каждом баре. Посмотри пожалуйста.
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.
Изменено 14 февраля, 2019 пользователем MikR0ReR
Здравствуйте.
При тестировании своего советника в тестере стратегий у меня возникло недопонимание одного момента со спредом.
Например, для ордера Buy я рассчитываю SL в советнике по формуле
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
При проверке на демо-счете все работает корректно при закрытие сделки по стопу. А при проверке в тестере убыток увеличиваетя на размер некого фиксированного спреда. Причем настройки в поле "Спред" в тестере ничего не дают, результат не меняется.
Аналогично фин. результат сделки при закрытии по TP так же отличается на Демо и в тестере на тотже самьй спред.
Я не так давно пользуюсь тестером.
Подскажите, пожалуйста, что я делаю не так?
Подскажите, пожалуйста, что я делаю не так?
Попробуй как вариант модифицировать ордер уже после открытия. На 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 был один, потом стал другой.
проблема с 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) ;
}
Проблема не в функции, а в общей логике.проблема с CountSell().
подсчет открытых позиций на реале порой дает сбой. "успевает" открыть две позиции в место одной
Попробуй как вариант модифицировать ордер уже после открытия. На ECN типе счетов выставлять ТП/СЛ сразу нельзя, насколько я помню.
Возможно у тебя разница до целей возникает из-за проскальзывания и времени между выставлением ордера и модификацией - вначале Ask был один, потом стал другой.
Я так и делаю с модификацией.
И на демо все работает четко. SL выставляется ровно 10 пунктов, убыток при лоте 0.1 - 10$.
Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.
Вопросы:
Так и должно быть?
Как убрать этот спред? Я меняю его в настойках тестера в поле "спред", но ничего не менется, убыток по прежнему 10,5 при любом значении в поле "спред".
Кстати таже история, когда запускаю учебные советники из курса
Изменено 15 февраля, 2019 пользователем Larcher
"Как убрать этот спред? Я меняю его в настойках тестера в поле "спред", но ничего не менется, убыток по прежнему 10,5 при любом значении в поле "спред"."
- а ты, именно ноль вписывал в окне спреда?
- имею другой вопрос к TralingStop:
параметр шаг/step начинается только после достижения без убытка заданного параметром stoploss. то есть первый step = размеру stoploss.
- а хотелось бы что бы TralingStop сразу начинался по заданному шагу.
- как?
Возможно из-за другой стоимости пункта - зависит от валюты счёта и валют пары теста. Проверьте комиссию. Демо и тестер на одном счёте?Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.
Трал может включаться сразу после открытия ордера или некого уровня просадки - вопрос алгоритма. Вы готовы заранее задать условие включения трала если сделка ушла в минус на 10$ или на 20$? Поэтому проще определить БУ ордера как точку срабатывания условия включения трала.имею другой вопрос к TralingStop:
параметр шаг/step начинается только после достижения без убытка заданного параметром stoploss. то есть первый step = размеру stoploss.
- а хотелось бы что бы TralingStop сразу начинался по заданному шагу.
Возможно из-за другой стоимости пункта - зависит от валюты счёта и валют пары теста. Проверьте комиссию. Демо и тестер на одном счёте?Но при запуске в тестере стратегий убыток получается - 10,5$, хотя SL также выставлется ровно на 10 пунктов, те при расчете убытка в $ добавляется еще и спред.
Спасибо. Разобралась) Это не спред, а комиссия (счет ECN), я совсем про нее забыла ;) На демо финрезультат и комиссия показываются отдельно, а в тестере они суммируются.
Изменено 18 февраля, 2019 пользователем 0ll
Вы готовы заранее задать условие включения трала если сделка ушла в минус на 10$ или на 20$?
ну скажем так, я хотел бы попробовать такое условия срабатывания трала(сразу). запустить на тесте и проверить. потом поразмышлять над результатом.
я так понимаю речь идет об изменении этого условия:
...
if(OrderStopLoss() {
if(!OrderModify...
подскажите алгоритм для включения трала в роботу сразу после открытия ордера.
Нет, это условие перестановки СЛ. Включается трал в месте вызова функции.я так понимаю речь идет об изменении этого условия:
Алгоритм простой: если есть рыночные ордера - вызываем функцию для каждого.
Новый урок:
http://tradelikeapro.ru/mql4-raschet-stat-koeffitsientov/
Включается трал в месте вызова функции.
в месте вызова, какой функции:OrderModify(), или там где запускаетсяTrailing() ?
Изменено 19 февраля, 2019 пользователем Ar4i
функции трала. Ar4i Вы свой код показываете кусочками и хотите помощи...
функции трала. 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
fcplm я и веду речь о том, что не вижу кода места вызова функции Trailing(). Там должно условие какое-то быть...понял. исправляюсь:
ну и уже соответственно в нужном мне контексте вставляю: Trailing().
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
У Вас Трал включается только при условии на вход, т.е. максимум 1 раз за свечу - поэтому не работает.правда не понимаю какое значение это может имеет к самому интересующему меня моменту алгоритма самой функции Trailing().
изменил но суть та же.
В разведке служите? В чём суть-то?изменил но суть та же.
В чём суть-то?
есть функция:
//----------------
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
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем