Советники: DVD Level - страница 11

 

Рискну предложить свой вариант изменения лотов после убыточной сделки :

в переменных добавляем

//===================================
extern double K_0 = 2;//множетель первого лота
extern double K = 2;//множетель последующих лотов
extern double MaxLot = 100000;
extern bool LotsSize = false;//включает динамический лот т.е лот изменяется в процентах от депозита 0.02=2%
extern double MaximumRisk = 0.02;// % депозита выделяемого на лот
extern int Losse = 1;// после скольки минусовых сделок мы включаем функцию увеличения лота

затем по коду

ticket=OrderSend(Symbol(),OP_BUYLIMIT,/*lotMM*/ LotsOptimized(),myPrice,Slippage,myStopLoss,myTakeProfit,ExpertName, MagicNumber,myTimeEnd,myColor);

и

ticket=OrderSend(Symbol(),OP_SELLLIMIT,/*lotMM*/ LotsOptimized(),myPrice,Slippage,myStopLoss,myTakeProfit,ExpertName, MagicNumber,myTimeEnd,myColor);

и в концк кода

//+------------------------------------------------------------------+
//| Get number of lots for this trade |
//+------------------------------------------------------------------+
double GetLots()
{/*
double lot;
if(MoneyManagement)
{
lot=LotsOptimized();
}
else
{
lot=Lots;
if(AccountIsMini)
{
if (lot > 1.0) lot=lot/10;
if (lot < 0.1) lot=0.1;
}
}
//----
return(lot);*/
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
/*
double LotsOptimized()
{
double lot=Lots;
//---- select lot size
lot=NormalizeDouble(MathFloor(AccountFreeMargin()*TradeSizePercent/1000)/100,2);
// Check if mini or standard Account
if(AccountIsMini)
{
lot=MathFloor(lot*100)/100;
// Use at least 1 mini lot
if(lot<0.1) lot=0.1;
if (lot > MaxLots) lot=MaxLots;
}
else
{
if (lot < 1.0) lot=1.0;
if (lot > MaxLots) lot=MaxLots;
}
//----
return(lot);
}
*/
//начинаем вычислять размер лота который надо поставить
double LotsOptimized()
{
double x=Losse;
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
{
if(LotsSize)
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,2);//если extern bool LotsSize=true тогда лот меняется от депозита в %
//если extern bool LotsSize=false тогда работаем по мартингейлу
}
//---- calcuulate number of losses orders without a break
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>((x)-1)) lot=NormalizeDouble(lot*K_0,2);//здесь учитываем какой размер лота был и какой должен стать после проигрыша
if(losses>((x*2)-1)) lot=NormalizeDouble(lot*K,2);//сейчас каждый последующий лот равен предыдущему умноженному на К
if(losses>((x*3)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*4)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*5)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*6)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*7)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*8)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*9)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*10)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*11)-1)) lot=NormalizeDouble(lot*K,2);
}
//---- return lot size
if(lot<0.1) lot=0.1;//если по каким то расчетам у нас последующий лот посчитается меньше чем 0.1 тогда все равно
//минимальный лот не может быть меньше чем 0.1 это условие ДЦ на альпари классик

if(lot>MaxLot) lot=MaxLot;// при увеличении лота макс.лот не может быть более заданного пользователем в настройках
return(lot);
}

Меняя в настройках значения К_0 и К можно по желанию регулировать размеры последующих, после убыточных сделок, лотов.Хоть уменьшать хоть увеличивать. А если вместо К ставить К_1 .......К_10 то можно вводить множитель каждого последующего лота. Например К_0 = 10, К_1 =2, К_2= 0.5 и т.д.Единственное это нужно будеть вынести наверх в настройки.

extern double K_0 = 2;//множетель первого лота

.

.
extern double K_10 = 2;//множетель последующих лотов

А учитывая, что длительность серии отрицательных сделок невелика, то по желанию К_0 и т.д можно назначить = 10. Тогда при лосе = 210, следующий лот будет = 1 и профит будет = 180.(настройки по умолчанию).

 
denisdenisov:
mql4dar:
Осваиваю MT4 c этой системой. Не удается прогнать тест. А именно, хотя дата указана с начала 2009 года, тестирует только последнюю неделю. Видимо история не загрузилась. А в инструкции написано типа "при текстировании загрузится автоматически". Что делать?

Грузите вручную Сервис -> Архив котировок -> выбираете символ и период жмете Загрузить.

Сделал примерно так. А точнее, как сказано в 2. Загрузка полной истории котировок на http://usd.ucoz.ru/publ/1-1-0-43

Работало несколько часов, но результат - не такой, как здесь. Хотелось бы разобраться. Вопросы 1) Где взять результаты в той форме, как у вас вверху страницы 2) Как сохранить все результаты этого многочасового прогона на будущее 3) Можно привести резудьтаты здесь, если не смогу разобраться?

 
Grigras:
Получилось! Сейчас всё-таки лот между СЛ наращивается (видимо из-за привязки его к средствам), это может привести к тому, что очередной СЛ придется на макс. лот. Я предлагаю после СЛ жёстко уменьшать лот от макс. к мин. до следующего СЛ. Так можно?
В доработанном GetLots в стандартной ситуации величина лота определяется в заданных процентах от свободных средств (если MoneyManagement=true). Вот этот кусок кода: lot=MathFloor(Free*TradeSizePercent*0.01/One_Lot/Step)*Step; А когда был пойман SL, тогда размер следующего лота определяется величиной полученного убытка: lot = MathFloor(-2*loss/One_Lot/Step)*Step; где loss = GetProfitLastClosePos(); - величина убытка полученного в последний раз.  А если хочется жестко задавать размер лотов, то ставь MoneyManagement=false. Тогда lot=Lots;
 
mql4dar:
denisdenisov:
mql4dar:
Осваиваю MT4 c этой системой. Не удается прогнать тест. А именно, хотя дата указана с начала 2009 года, тестирует только последнюю неделю. Видимо история не загрузилась. А в инструкции написано типа "при текстировании загрузится автоматически". Что делать?

Грузите вручную Сервис -> Архив котировок -> выбираете символ и период жмете Загрузить.

Сделал примерно так. А точнее, как сказано в 2. Загрузка полной истории котировок на http://usd.ucoz.ru/publ/1-1-0-43

Работало несколько часов, но результат - не такой, как здесь. Хотелось бы разобраться. Вопросы 1) Где взять результаты в той форме, как у вас вверху страницы 2) Как сохранить все результаты этого многочасового прогона на будущее 3) Можно привести резудьтаты здесь, если не смогу разобраться?

Отвечаю пока самому себе. Отчет сохраняется по правой кнопке. А всю остальную инфо можно сохранить для этого эксперимента отдельно?

Различие такие, что в моем эксперименте оказалось Lots=0.01; MaxLots=4; А почему сейчас так в программе ? Это что-то улучшает по сравнению с Lots=0.1; MaxLots=100; ?

Еще неясно следующее. Я поставил дату по 2010.10.22, однако же получилось так 2009.01.02 10:00 - 2010.10.15 22:59 (2009.01.02 - 2010.10.22). Как побороть - реально продлить с 10.15 по до 10.22 ?

 

mql4dar:

 

Отвечаю пока самому себе. Отчет сохраняется по правой кнопке. А всю остальную инфо можно сохранить для этого эксперимента отдельно?

Различие такие, что в моем эксперименте оказалось Lots=0.01; MaxLots=4; А почему сейчас так в программе ? Это что-то улучшает по сравнению с Lots=0.1; MaxLots=100; ?

Еще неясно следующее. Я поставил дату по 2010.10.22, однако же получилось так 2009.01.02 10:00 - 2010.10.15 22:59 (2009.01.02 - 2010.10.22). Как побороть - реально продлить с 10.15 по до 10.22 ?


предлагаю Вам обратиться сюда: http://forum.mql4.com/ru/15972
 

Еще вопросик. Насколько я вижу комментарии по MT4, в ней нет пошаговой отладки, а в MT5 есть.

Можно ли этот кода запустить в MT5 для пошаговой отладки ? Можно ли одновременно установить на компе MT4 (уже стоит) и MT5 ?

Спасибо.

 
ikatsko:

mql4dar:

Отвечаю пока самому себе. Отчет сохраняется по правой кнопке. А всю остальную инфо можно сохранить для этого эксперимента отдельно?

Различие такие, что в моем эксперименте оказалось Lots=0.01; MaxLots=4; А почему сейчас так в программе ? Это что-то улучшает по сравнению с Lots=0.1; MaxLots=100; ?

Еще неясно следующее. Я поставил дату по 2010.10.22, однако же получилось так 2009.01.02 10:00 - 2010.10.15 22:59 (2009.01.02 - 2010.10.22). Как побороть - реально продлить с 10.15 по до 10.22 ?


предлагаю Вам обратиться сюда: http://forum.mql4.com/ru/15972
Можно конечно обращаться на другие форумы и долго въезжать в тему. Моя задача - поскорее повторить тестирование, и постараться поставить эту систему на реальную работу на внешнем сервере. Потому и спрашиваю здесь - может, удасться быстрее реализовать это (см также вопрос про размещение на сервере). А также, другие новички, возможно, смогут быстрее сделать это же, прочитав весь путь здесь.
 
mql4dar:

Еще вопросик. Насколько я вижу комментарии по MT4, в ней нет пошаговой отладки, а в MT5 есть.

Можно ли этот кода запустить в MT5 для пошаговой отладки ? Можно ли одновременно установить на компе MT4 (уже стоит) и MT5 ?

Спасибо.


В МТ5 не тестировал, поставить на тотже комп можно, можно даже ставить несколько МТ4 на один комп (надо ставить в разные папки). Основная проблема с МТ5 идеологическая в нем невозможно открыть одновременно сделки SELL и BUY - противоположная сделка с тем же лотом просто закрывает предыдущую. По поводу периодов, я знаю 2 варианта, либо не хватает истории тиков, либо ошиблись при выставлении периода.
 
gss:

Рискну предложить свой вариант изменения лотов после убыточной сделки :

в переменных добавляем

//===================================
extern double K_0 = 2;//множетель первого лота
extern double K = 2;//множетель последующих лотов
extern double MaxLot = 100000;
extern bool LotsSize = false;//включает динамический лот т.е лот изменяется в процентах от депозита 0.02=2%
extern double MaximumRisk = 0.02;// % депозита выделяемого на лот
extern int Losse = 1;// после скольки минусовых сделок мы включаем функцию увеличения лота

затем по коду

ticket=OrderSend(Symbol(),OP_BUYLIMIT,/*lotMM*/ LotsOptimized(),myPrice,Slippage,myStopLoss,myTakeProfit,ExpertName, MagicNumber,myTimeEnd,myColor);

и

ticket=OrderSend(Symbol(),OP_SELLLIMIT,/*lotMM*/ LotsOptimized(),myPrice,Slippage,myStopLoss,myTakeProfit,ExpertName, MagicNumber,myTimeEnd,myColor);

и в концк кода

//+------------------------------------------------------------------+
//| Get number of lots for this trade |
//+------------------------------------------------------------------+
double GetLots()
{/*
double lot;
if(MoneyManagement)
{
lot=LotsOptimized();
}
else
{
lot=Lots;
if(AccountIsMini)
{
if (lot > 1.0) lot=lot/10;
if (lot < 0.1) lot=0.1;
}
}
//----
return(lot);*/
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
/*
double LotsOptimized()
{
double lot=Lots;
//---- select lot size
lot=NormalizeDouble(MathFloor(AccountFreeMargin()*TradeSizePercent/1000)/100,2);
// Check if mini or standard Account
if(AccountIsMini)
{
lot=MathFloor(lot*100)/100;
// Use at least 1 mini lot
if(lot<0.1) lot=0.1;
if (lot > MaxLots) lot=MaxLots;
}
else
{
if (lot < 1.0) lot=1.0;
if (lot > MaxLots) lot=MaxLots;
}
//----
return(lot);
}
*/
//начинаем вычислять размер лота который надо поставить
double LotsOptimized()
{
double x=Losse;
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
{
if(LotsSize)
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,2);//если extern bool LotsSize=true тогда лот меняется от депозита в %
//если extern bool LotsSize=false тогда работаем по мартингейлу
}
//---- calcuulate number of losses orders without a break
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>((x)-1)) lot=NormalizeDouble(lot*K_0,2);//здесь учитываем какой размер лота был и какой должен стать после проигрыша
if(losses>((x*2)-1)) lot=NormalizeDouble(lot*K,2);//сейчас каждый последующий лот равен предыдущему умноженному на К
if(losses>((x*3)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*4)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*5)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*6)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*7)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*8)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*9)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*10)-1)) lot=NormalizeDouble(lot*K,2);
if(losses>((x*11)-1)) lot=NormalizeDouble(lot*K,2);
}
//---- return lot size
if(lot<0.1) lot=0.1;//если по каким то расчетам у нас последующий лот посчитается меньше чем 0.1 тогда все равно
//минимальный лот не может быть меньше чем 0.1 это условие ДЦ на альпари классик

if(lot>MaxLot) lot=MaxLot;// при увеличении лота макс.лот не может быть более заданного пользователем в настройках
return(lot);
}

Меняя в настройках значения К_0 и К можно по желанию регулировать размеры последующих, после убыточных сделок, лотов.Хоть уменьшать хоть увеличивать. А если вместо К ставить К_1 .......К_10 то можно вводить множитель каждого последующего лота. Например К_0 = 10, К_1 =2, К_2= 0.5 и т.д.Единственное это нужно будеть вынести наверх в настройки.

extern double K_0 = 2;//множетель первого лота

.

.
extern double K_10 = 2;//множетель последующих лотов

А учитывая, что длительность серии отрицательных сделок невелика, то по желанию К_0 и т.д можно назначить = 10. Тогда при лосе = 210, следующий лот будет = 1 и профит будет = 180.(настройки по умолчанию).


Уже есть переменная MaxLots, зачем нужна еще одна MaxLot?
 

Текущие сделки в реале

Ticket Open Time Type Size Item Price S / L T / P Close Time Price Commission Taxes Swap Profit
18454535 2010.11.01 03:02 sell limit 0.44 eurusd 1.40023 1.42123 1.39843 2010.11.01 03:22 1.39877 expiration [2010.11.01 03:22]
4101 expiration [2010.11.01 03:22]
18455097 2010.11.01 06:12 sell limit 0.44 eurusd 1.40021 1.42121 1.39841 2010.11.01 06:32 1.39920 expiration [2010.11.01 06:32]
4101 expiration [2010.11.01 06:32]
18461051 2010.11.01 15:13 buy 0.44 eurusd 1.38948 1.36848 1.39128 2010.11.02 00:50 1.39128 0.00 0.00 0.13 79.20
4101 DVD 100 cent: 4101 : EURUSD[tp]