Ударим умным мани-менеджментом по бездорожью рынков!📌

От talliy, 21 декабря, 2012 в Уголок Программиста

Страница 3 из 3
#51


В чем проблема пока не выяснили? чуть позже хочу поизучать код


Я вроде правил давненько, попробуйте
double MMCoeff()
{
if (OrdersHistoryTotal()==0) return(1);
double Pips[];
int OrdersCount=0,i=0,j=1,k=0;
for(i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=MAGIC||OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY||OrderType()==OP_SELL)OrdersCount++;
}
ArrayResize(Pips,OrdersCount+1);
for(i=0; i {
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=MAGIC||OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
//Print(__FUNCTION__ , ": OP_BUY j = ", j, ", Pips[j] = ",Pips[j]);
Pips[j]=Pips[j-1]+(OrderClosePrice()-OrderOpenPrice())/_Point;
}
if (OrderType()==OP_SELL)
{
//Print(__FUNCTION__ , ": OP_SELL j = ", j, ", Pips[j] = ",Pips[j], ", ArraySize ", ArraySize(Pips));
Pips[j]=Pips[j-1]+(OrderOpenPrice()-OrderClosePrice())/_Point;
}
j++;
}

double BBUp=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_UPPER,0);
double BBDn=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_LOWER,0);
double BBCt=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_MAIN,0);
double CCI0=iCCIOnArray(Pips,0,CCIMMPer,0);
double CCI1=iCCIOnArray(Pips,0,CCIMMPer,1);
if(UseMABalanceCorr)
{
if(Pips[OrdersCount-1]BBDn)
{
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1] {
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1]>BBCt&&Pips[OrdersCount-1] {
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1]>BBUp)
{
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
}
if(!UseMABalanceCorr&&UseOSCBalanceCorr)
{
if(CCI0CCI1) return(Coeff1);
if(CCI0 if(CCI0>-CCIMMLevel&&CCI0 if(CCI0>-CCIMMLevel&&CCI0>CCI1) return(Coeff4);
}
return(1); }


Супер, спасибо) правда на микротесте пока слил больше с этой функцией..., но надо проверять и изучать

Добавлено: 09-11-2017 18:51:06

А вот при увеличении времени теста уже всё гораздо приятнее :9>-

Изменено 9 ноября, 2017 пользователем SVS696

#52

extern double Coeff1 = 1.6;
extern double Coeff2 = 1.4;
extern double Coeff3 = 1.2;
extern double Coeff4 = 0.8;
extern double Coeff5 = 0.6;
extern double Coeff6 = 0.4;


Когда какой Кф применяется:
-Если Используются Ленты Боллинжера (UseMABalanceCorr = true), И
№1-кривая доходности CCI предыдущий и №2-кр. дох.нижней ВВ и ССІтек>ССІпред и №3-кр. дох.>средней ССІпред и №4-кр. дох.>средней №4-кр.дох.>верхней ВВ и ССІтек>ССІпред и №5-кр. дох.нижней ВВ И ССІтек№5-кр.дох.>верхней ВВ И ССІтек№6-кр. дох.
-Если НЕ используются Ленты Боллинжера (UseMABalanceCorr = false), и
№1 - ССІтекССІпред;
№3 - ССІтек>отрицательного CCIMMLevel и ССІтек№4- ССІтек>отрицательного CCIMMLevel и ССІтек>ССІпред;
№6 -ССІтек
Прошу прокомментировать правильно ли я понял когда какой Кеф, применяется.


Добавлено: 20-02-2018 09:40:21

Получилось много букв и не очень то понятно.
Попытался изобразить графически

Изменено 20 февраля, 2018 пользователем RichLux

#53


Цитата

Доходность бралась абсолютная или как эффективность 1 лота (пункты) ?


Доходность бралась с учетом мм совы. Брался сет и без изменений в настройках применялись разные варианты фильтра. Чуть позже выложу код, исследование пока не готово.
ПыСы. Не понял вопрос. Сама кривая доходности, по которой строятся индикаторы, выстроена из пунктов. То есть:
1 сделка -20 пунктов.
2 +50 и -20 = +30
3. +70 и +30 = +100
4 -40 и +100 = +60
и так далее.
Именно в пунктах, так как если привязаться к процентам по счету или деньгам, будут проблемы с расчетом из-за мм. А тут как бы абсолютные величины, ни к чему не привязанные, кроме способности бота обеспечить положительное матожидание.

Буквально в течение часа выложу итог исследования и код, терпение:)

Добавлено: 22-07-2016 14:07:34

И вот он, финальный результат:

Спойлер


Отмечу, что кроме изменения расчетного лота, никакие параметры больше не модернизировались - это всего лишь волшебство манименеджмента!
Для сравнения, что было изначально:



Ну а теперь собсна сама функция и как ее запихнуть в сову:
Спойлер


[code=внешние настройки]
extern string Settings076 = "====Настройки кривой баланса====";
extern bool UseBalanceCorr = true;
extern bool UseMABalanceCorr = true;
extern int MAMMPer = 14;
extern double MADev = 1.0;
extern bool UseOSCBalanceCorr = true;
extern int CCIMMPer = 7;
extern double CCIMMLevel = 40;
extern double Coeff1 = 1.6;
extern double Coeff2 = 1.4;
extern double Coeff3 = 1.2;
extern double Coeff4 = 0.8;
extern double Coeff5 = 0.6;
extern double Coeff6 = 0.4;


Добавим строчку в то место, где у нас высчитывается лот. Если UseBalanceCorr включена, лот, рассчитанный совой, просто модифицируется путем умножения на возвращаемое функцией MMCoeff() значение:


if(UseBalanceCorr) Lot=Lot*MMCoeff();


[code=собсна сама функция]
double MMCoeff()
{
if (OrdersHistoryTotal()==0) return(1);
double Pips[];
int OrdersCount=0,i=0,j=0,k=0;
for(i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=Magic||OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY||OrderType()==OP_SELL)OrdersCount++;
}
ArrayResize(Pips,OrdersCount);
for(i=0; i {
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=Magic||OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
Pips[j]=Pips[j-1]+(OrderClosePrice()-OrderOpenPrice())/PricePoint;
}
if (OrderType()==OP_SELL)
{
Pips[j]=Pips[j-1]+(OrderOpenPrice()-OrderClosePrice())/PricePoint;
}
j++;
}

double BBUp=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_UPPER,0);
double BBDn=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_LOWER,0);
double BBCt=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_MAIN,0);
double CCI0=iCCIOnArray(Pips,0,CCIMMPer,0);
double CCI1=iCCIOnArray(Pips,0,CCIMMPer,1);
if(UseMABalanceCorr && OrdersCount>1)
{
if(Pips[OrdersCount-1]BBDn)
{
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1] {
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1]>BBCt&&Pips[OrdersCount-1] {
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1]>BBUp)
{
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
}
if(!UseMABalanceCorr&&UseOSCBalanceCorr)
{
if(CCI0CCI1) return(Coeff1);
if(CCI0 if(CCI0>-CCIMMLevel&&CCI0 if(CCI0>-CCIMMLevel&&CCI0>CCI1) return(Coeff4);
}
return(1);
}




Выводы: Результаты тестов показали, что данная функция действительно значительно улучшает базовые результаты советников, позволяя более гибко и грамотно использовать силу манименеджмента себе во благо. Следующим шагом для пытливого ума может стать перевод сделок с заниженного лота на виртуальную торговлю, чтобы в случае просадок не тратить и цента. Также возможно использование и еще более сложного и мудреного алгоритма.
Лично я буду использовать данную функцию в своих советниках.



Сайлент! Спасибо. Классный фильтр для ММ, все тесты с ним получаются профитнее. Прям не ожидал сам. Немного подправил код, иначе обращались к несуществующему элементу массива. UPDATE нашел еще один мелкий косячек в коде, исправил.


double MMCoeff()
{
if (OrdersHistoryTotal()==0) return(1);
double Pips[];
int OrdersCount=0,i=0,j=0,k=0;
for(i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=Magic || OrderSymbol()!=_Symbol) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL)OrdersCount++;
}
ArrayResize(Pips,OrdersCount);
for(i=0; i {
if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=Magic||OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
if (j>0) Pips[j]=Pips[j-1]+(OrderClosePrice()-OrderOpenPrice())/_Point;
else
{
Pips[j]=(OrderClosePrice()-OrderOpenPrice())/_Point;
}
}
if (OrderType()==OP_SELL)
{
if (j>0) Pips[j]=Pips[j-1]+(OrderOpenPrice()-OrderClosePrice())/_Point;
else
{
Pips[j]=(OrderOpenPrice()-OrderClosePrice())/_Point;
}
}
j++;
}

double BBUp=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_UPPER,0);
double BBDn=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_LOWER,0);
double BBCt=iBandsOnArray(Pips,0,MAMMPer,MADev,0,MODE_MAIN,0);
double CCI0=iCCIOnArray(Pips,0,CCIMMPer,0);
double CCI1=iCCIOnArray(Pips,0,CCIMMPer,1);
if(UseMABalanceCorr)
{
if(Pips[OrdersCount-1]BBDn)
{
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1] {
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1]>BBCt&&Pips[OrdersCount-1] {
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
if(Pips[OrdersCount-1]>BBUp)
{
if(UseOSCBalanceCorr&&CCI0>CCI1&&CCI0 if((UseOSCBalanceCorr&&CCI0 }
}
if(!UseMABalanceCorr&&UseOSCBalanceCorr)
{
if(CCI0CCI1) return(Coeff1);
if(CCI0 if(CCI0>-CCIMMLevel&&CCI0 if(CCI0>-CCIMMLevel&&CCI0>CCI1) return(Coeff4);
}
return(1);
}

Изменено 17 октября, 2018 пользователем djnet

Страница 3 из 3

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

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