Блог им. neophyte
К концу дня совсем перестал соображать...
Сегодня завершал настройку второстепенных параметров советников. Завершил и начал тестировать.
Три часа угробил разбираясь в тесте и не понимая почему робот прекращает торговлю.
Оказывается размер сделки с ростом капитала выходил вверх за 100 лотов, а больше 100 лотов в одном ордере брокер открывать не разрешает.
Поставил переход, если больше 100, то все равно 100. И все наладилось.
Красивая картинка, сумасшедший профит. Жалко на реале такого не бывает...
Но в общем-то в выходные наверное надо отдыхать.
P.S. Осталась одна нереализованная идея — асимметрия торгового риска для портфельной торговли. Пока не знаю как подступиться, но все-таки на следующей неделе наверное сделаю.
В связи с этим совершенно дилетантская просьба к специалистам по MQL4: как выделить последнюю по времени закрытую сделку по инструменту, а точнее, как определить результат последней закрытой сделки — прибыльный или убыточный?
Решения, которые под рукой громоздки и не совсем для меня понятны, может это тоже из-за усталости к концу дня и потому что вдруг закончился запас кофе.
Тест с асимметрией риска (для одного инструмента сделано, нет для портфеля.):
В чем плюс? Больше прибыль, меньше просадка.
P.P.S. Половина купонов, которые на прошлой неделе расхватали, осталась неиспользованной + появились новые. По 15 долларов.
Пропадут. Налетайте и забирайте, кому надо. Для центовых счетов самый раз, сам бы взял, но нужно отдавать на сторону.
Если у кого-то ключ не сработает, вышлю еще.
Lankfrend, да я думал.
Но для человека, у которого из рыболовных снастей и экипировки только моток лески в шкафу, да и тот предназначен для хозяйственных нужд, это требует больших организационных усилий.
Плюс проблема куда поехать и с кем, поскольку в ближайшем окружении рыболовов нет. А с кем попало хуже чем ни с кем...
Ну или можно скачать симулятор на компьютер) тоже развлечение)
...
Не маловат ли спред поставили в тесте? Всего 10)
Kaiman, спасибо.
Что нужно сделать и как я примерно представляю. Вопрос как это сделать в МТ4? Если торгуется один инструмент, я это делаю легко, по знаку изменения баланса.
Но мне нужно сделать для портфеля. Т.е. нужно выбрать не просто последний закрытый ордер, а последний закрытый по символу. Т.е. нужно двигаться с конца, пока не совпадет символ, а дальше смотреть знак прибыли.
Поскольку я не программист и с этими отборами еще не работал, это и вызывает некоторые вопросы… В частности не совсем ясен порядок перебора, с какого номера начинать. Ну и еще кое какие мелочи.
В общем проблема решаемая. Просто может есть ссылка на готовое решение...
Перебираете циклом ордера и ищете нужный символ if(Symbol()==«EURUSD» )
if(OrderSymbol()!=Symbol()) continue;
Альтернативный вариант: можно запоминать тикет каждого открываемого ордера, а потом их проверять.
Алексей Дорожинский, примерно так, как в ссылке. Спасибо.
Вот только последний закрытый это номер 0, или с другого конца надо считать?
Запоминать тикеты громоздко. И так по 100-200 ордеров в сутки. Через месяц советники только и будут делать, что перебирать ордера. Хотя здесь можно ввести блокировку перебора по отсутствию изменения баланса...
Строчек в 6-7 может уложусь.
выбор последнего закрытого ордера
Kaiman, торгуется портфель из множества инструментов, и нужно выбрать не просто последний закрытый ордер, а последний закрытый по данному конкретному инструменту.
Если бы торговался один инструмент, то вопросов вообще не возникает, контролируешь баланс счета и все.
Но в принципе я уже примерно знаю, как сделать перебор и где остановиться...
Тока я еще ничего не делал. Даже проснуться толком не успел…
P.S. А вообще-то, если у вас есть что предложить, то лучше ждать, пока у меня получится/не получится, а сразу опубликовать. Если там нет бооооольших секретов. А если есть секреты, которые нужно хранить, то о них лучше вообще не упоминать.
Да какие там секреты ))), только так сходу, одной строкой, не объяснить.
Вот шаблон советника, может что-то прояснит. Только стиль программирования не стандартный, у меня большой монитор (46'') и поэтому я пишу длинные строки.И по мере возможностей стараюсь не использовать команду «if»(тормозит). Если что, всегда готов ответить на любые вопросы. Особенно на тему MQL )))
в тестере эта штука не работает
https://mega.nz/#!QIQlSDRa!GtxymEwofN0aUpV_kqKaeiDcoT7dO123cB0qp0U5SsE
Алексей Дорожинский, спасибо.
Не рискнул грузить незнакомый файл с незнакомого сайта. После пары катастроф предохраняюсь со страшной силой. :)
for(i=OrdersHistoryTotal();i>0;i--)
{
OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()!=Symbol()) continue;
if(OrderProfit()>0) ................
}
типа такого)
Kaiman, пасиб. Вроде все так, цикл только нужно проверить...
Но буду завтра смотреть, сегодня мыслительные способности уже отключены.
В вашем варианте я бы сделал так (если не ошибаюсь):
for(i=OrdersHistoryTotal()-1;i>0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if(OrderSymbol()!=Symbol()) continue;
if(OrderProfit()>0) ................
}
плюс в МТ4 всегда левые котировки
Хотя может я и ошибаюсь. Впрочем, я никогда результатам тестов не придавал особого значения. Для меня главное — это проверка работоспособности в принципе и вылавливание принципиальных косяков.
Хреновая стратегия на любом тестере даст хреновый результат. С ней и возиться дальше особого смысла нет. А если результат неплох, то можно и поковыряться…
//-- Расчет лота по мартингейлу -------------------------------------------------
case 3:
double k=1; // Переменная, от значения которой зависит, будет ли удваиваться следующий лот
if (OrdersHistoryTotal()==0) return(Lots); // Если история пустая, торгуем стартовым лотом
for (int i=OrdersHistoryTotal()-1;i>-1;i--) // Перебор всех закрытых позиций и удаленных ордеров
{
bool OrderSelec=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); // Выбираем ордер
if(OrderCloseTime()!=0 && OrderProfit()>0) bool mart=true; // Если выбранный ордер — закрыт с прибылью, следующая строка удвоения лота не выполняется, просто переходим к следующей итерации...
if(OrderCloseTime()!=0 && OrderProfit()<0 && !mart) k*=KotMMMetod3; // Если выбранный ордер — закрыт с убытком, удваиваем коэффициент мартингейла
}
double MartinLot=k*Lots; // Рассчитываем лот по мартингейлу, размер k зависит от количества идущих подряд убыточных сделок
if(MartinLot>MarketInfo(Symbol(),MODE_MAXLOT)) {Alert(«Рассчитанный лот больше максимально допустимого!»); return(0.01);} // Если рассчитанный лот больше допустимого, выходим
if(MartinLot*MarketInfo(Symbol(),MODE_MARGINREQUIRED)>AccountFreeMargin()) {Alert(«Размер свободных средств не позволяет открыть позицию с рассчитанным лотом!»); return(0.01);}// Если размер свободных средств не позволяет открыть позицию с рассчитанным лотом, выходим
retlot=MartinLot;
break;
//-------------------------------------------------------------------------------
default:
retlot=Lots;
}
if(retlot<1.0/MathPow(10,LotsDigits))retlot=1.0/MathPow(10,LotsDigits) ;
retlot=NormalizeDouble(retlot,LotsDigits);
if(AccountFreeMarginCheck(Symbol(),aTradeType,retlot)<=0){
return(-1);
}
if(GetLastError()==134){
return(-2);
}
return(retlot);
}
Sergii Onyshchenko (osa), посмотрю. Спасибо.
У меня не мартингейл, но ордера все рано нужно анализировать.
Sergii Onyshchenko (osa), присмотрелся.
Похоже как прототип для модификации в самый раз. Завтра начну адаптировать...
Если вы обиделись, что я не вспомнил про вас сам и не выслал ключ, извините. Бывает из-за дел.
Александр НеПушкин, это лишнее.
Раздавая купоны я не претендую на какие-либо ответные шаги и движения.