Предлагаю обсудить такую тему: насколько актуальна торговля по нескольким Сиволам и/или ТаймФреймам в рамках одного эксперта?
сейчас сижу и думаю - выкладывать ли мне symbol_lib и шаблон эксперта, предназначенные именно для этого =) и думаю, что такой необходимости нет... если торговля будет по разным счетам - всё равно придёться запускать несколько терминалов, а если по одному - то просто несколько окон открыть. И путаницы меньше, вроде бы...
Интересно будет выслушать мнения и аргументы к ним ;)
int CurPrice_p=Bid/Point; //текущая цена в пунктах
int CurSLoss=OrderStopLoss( )/Point; //текущий стоплосс в пунктах
int TS=40; //значение трейлингстопа в пунктах
if(TS>=5)
{
int TStep=2; //минимальный шаг трейлинг стопа
if(TStep<1) TStep=1; //проверка шага трейлинга
{
if(MathAbs(CurPrice_p-CurSLOss)>=TS+TStep)
{
if(CurPrice_p>CurSLOss)
{
double NewSLoss=(CurPrice_p-TS)*Point;
изменить уровень стоплосс ордера на новый
}
if(CurPrice_p>CurSLOss)
{
NewSLoss=(CurPrice_p+TS)*Point;
изменить уровень стоплосс ордера на новый
}
}
}
}
а это мысль... это больше чем мысль - это идея )) на днях буду разгребать ошибки, собранные экспертом, подумаю ещё про реализацию торговых ф-ций. На следующей неделе поделюсь ;)
Предлагаю обсудить такую тему: насколько актуальна торговля по нескольким Сиволам и/или ТаймФреймам в рамках одного эксперта?
по результатам голосования ( 1 - против (komposter), 0 - за, остальные - воздержались ) принято решение не разводить мусор про многосимвольную торговлю в этой ветке =) Если кому-нибудь будет всё-таки интересно, пишите - библиотекой поделюсь ;-|
Выкладываю небольшую , и на мой взгляд полезную, утилиту для визуального анализа позиций после прогона бек-теста. Возможно дальнейшее развитие идеи для анализа истории сделок в он-лайн и разбора чужих стейтментов. Чтобы использовать: 1. Записать этот файл с расширением mqh, Tracert.mqh в папку experts\include\ 2. Добавить в своего советника в самом начале строчку #include <Tracert.mqh>
3. В самом начале в блоке start() вставить функцию SetTrace();
int start()
{
int ticket, total,totalExpert;
//------------------------------------------------------
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
SetTrace();
4. После прогона советника открыть файл и получить что-то вроде этого:
Сам код утилиты:
//+------------------------------------------------------------------+
//| Tracert.mq4 |
//| Rosh |
//| http://forexsystems.ru/phpBB/index.php |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link "http://forexsystems.ru/phpBB/index.php"
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
double tr_AOPLong,tr_AOPShort;
double tr_LongLots,tr_ShortLots;
int tr_CurrLongOrders,tr_CurrShortOrders;
int tr_Total,tr_Counter;
int tr_PrevLongOrders,tr_PrevShortOrders;
int tr_CurrTotalOpenedOrders,tr_PrevTotalOpenedOrders;
double tr_CurrBalance,tr_PrevCurrBalance;
color tr_ProfitColor=Lime, tr_LossColor=DeepPink,tr_LongAOPColor=Blue,tr_ShortAOPColor=Red, tr_CurrCloseColor;
int tr_CloseLabelArrow=108, tr_AOPLabelArrow=159;
bool tr_CloseLong,tr_CloseShort;
double tr_CloseLabelPrice;
int tr_CloseLabelShift=20;
int tr_CounterCloseLabel=0,tr_CounterAOPLabel=0;
int tr_Bars;
void SetTrace()
{
//----
if (IsTesting()&&(tr_Bars!=Bars))
{
tr_CloseLong=false;
tr_CloseShort=false;
tr_AOPLong=0.0;
tr_AOPShort=0.0;
tr_LongLots=0.0;
tr_ShortLots=0.0;
tr_CloseLabelShift=iATR(NULL,0,50,1)*3.0/10.0/Point;
if (tr_CurrBalance==0.0)
{
tr_CurrBalance=AccountBalance();
tr_PrevCurrBalance=AccountBalance();
}
//----------------Проверка открытых позиций ---------------------------
tr_CurrLongOrders=0;
tr_CurrShortOrders=0;
tr_CurrTotalOpenedOrders=0;
tr_Total=OrdersTotal();
if (tr_Total>0)// есть открытые позиции
{
for (tr_Counter=0;tr_Counter<tr_Total;tr_Counter++)// подсчет открытых позиций
{
OrderSelect(tr_Counter, SELECT_BY_POS, MODE_TRADES);
if (OrderType()==OP_BUY)
{
tr_CurrLongOrders++;
tr_AOPLong=tr_AOPLong+OrderLots()*OrderOpenPrice();
tr_LongLots=tr_LongLots+OrderLots();
}
if (OrderType()==OP_SELL)
{
tr_CurrShortOrders++;
tr_AOPShort=tr_AOPShort+OrderLots()*OrderOpenPrice();
tr_ShortLots=tr_ShortLots+OrderLots();
}
}// подсчет открытых позиций
//--------------- усреднение ---------------------
if (tr_CurrLongOrders>0) tr_AOPLong=tr_AOPLong/tr_LongLots;
if (tr_CurrShortOrders>0)tr_AOPShort=tr_AOPShort/tr_ShortLots;
//--------------- усреднение ---------------------
if (tr_AOPLong>0.0)
{
ObjectCreate("AOP"+tr_CounterAOPLabel,OBJ_ARROW,0,Time[1],tr_AOPLong);// не совсем корректно, но пока пойдет
ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_ARROWCODE,tr_AOPLabelArrow);
ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_COLOR,tr_LongAOPColor);
tr_CounterAOPLabel++;
}
if (tr_AOPShort>0.0)
{
ObjectCreate("AOP"+tr_CounterAOPLabel,OBJ_ARROW,0,Time[1],tr_AOPShort);// не совсем корректно, но пока пойдет
ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_ARROWCODE,tr_AOPLabelArrow);
ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_COLOR,tr_ShortAOPColor);
tr_CounterAOPLabel++;
}
// Print("Long=",tr_CurrLongOrders," tr_AOPLong=",tr_AOPLong," *** Short=",tr_CurrShortOrders," tr_AOPShort=",tr_AOPShort);
tr_CurrTotalOpenedOrders=tr_CurrLongOrders+tr_CurrShortOrders;
if ((tr_CurrTotalOpenedOrders!=tr_PrevTotalOpenedOrders)||(tr_PrevLongOrders!=tr_CurrLongOrders)||(tr_PrevShortOrders!=tr_CurrShortOrders)) // изменилось колчиство ордеров в рынке
{
if (tr_PrevLongOrders>tr_CurrLongOrders) // изменилось число ордеров в Long
{
tr_CloseLong=true;
tr_CloseLabelPrice=High[1]+tr_CloseLabelShift*Point;
}
if (tr_PrevShortOrders>tr_CurrShortOrders) // изменилось число ордеров в Short
{
tr_CloseShort=true;
tr_CloseLabelPrice=Low[1]-tr_CloseLabelShift*Point;
}
tr_PrevLongOrders=tr_CurrLongOrders;
tr_PrevShortOrders=tr_CurrShortOrders;
tr_PrevTotalOpenedOrders=tr_CurrTotalOpenedOrders;
}
}// есть открытые позиции
//---------------- Проверка изменения Баланса
tr_CurrBalance=AccountBalance();
if (tr_CurrBalance!=tr_PrevCurrBalance)// проверка изменения Balance
{
if (tr_CurrBalance-tr_PrevCurrBalance>0.0) tr_CurrCloseColor=tr_ProfitColor; else tr_CurrCloseColor=tr_LossColor;
tr_PrevCurrBalance=tr_CurrBalance;
//------------------ установка Метки закрытия --------------------
ObjectCreate("Close"+tr_CounterCloseLabel,OBJ_ARROW,0,Time[1],tr_CloseLabelPrice);
ObjectSet("Close"+tr_CounterCloseLabel,OBJPROP_ARROWCODE,tr_CloseLabelArrow);
ObjectSet("Close"+tr_CounterCloseLabel,OBJPROP_COLOR,tr_CurrCloseColor);
tr_CounterCloseLabel++;
//------------------ установка Метки закрытия --------------------
}// проверка изменения Balance
}//(IsTesting())
//----
tr_Bars=Bars;
return(0);
}
//+------------------------------------------------------------------+
В связи с выходом тестера (правда, немного запоздало), выкладываю trade_lib_tester и info_lib_tester. Потому как обычные их версии тестироваться не желают =))) Использовать - так же. Просто поменять в строках инклуд старые имена на новые
Не могли бы Вы выложить все эти файлы и последние и более ранние где-то на виаке или альпари или форексситемс или финлисте - в общем там, куда можно прикрепить файлы. Да и найти легче будет. Заранее спасибо.
Не могли бы Вы выложить все эти файлы и последние и более ранние где-то на виаке или альпари или форексситемс или финлисте - в общем там, куда можно прикрепить файлы. Да и найти легче будет. Заранее спасибо.
насколько актуальна торговля по нескольким Сиволам и/или ТаймФреймам в рамках одного эксперта?
сейчас сижу и думаю - выкладывать ли мне symbol_lib и шаблон эксперта, предназначенные именно для этого =)
и думаю, что такой необходимости нет... если торговля будет по разным счетам - всё равно придёться запускать несколько терминалов, а если по одному - то просто несколько окон открыть. И путаницы меньше, вроде бы...
Интересно будет выслушать мнения и аргументы к ним ;)
int CurPrice_p=Bid/Point; //текущая цена в пунктах int CurSLoss=OrderStopLoss( )/Point; //текущий стоплосс в пунктах int TS=40; //значение трейлингстопа в пунктах if(TS>=5) { int TStep=2; //минимальный шаг трейлинг стопа if(TStep<1) TStep=1; //проверка шага трейлинга { if(MathAbs(CurPrice_p-CurSLOss)>=TS+TStep) { if(CurPrice_p>CurSLOss) { double NewSLoss=(CurPrice_p-TS)*Point; изменить уровень стоплосс ордера на новый } if(CurPrice_p>CurSLOss) { NewSLoss=(CurPrice_p+TS)*Point; изменить уровень стоплосс ордера на новый } } } }а это мысль... это больше чем мысль - это идея ))
на днях буду разгребать ошибки, собранные экспертом, подумаю ещё про реализацию торговых ф-ций. На следующей неделе поделюсь ;)
насколько актуальна торговля по нескольким Сиволам и/или ТаймФреймам в рамках одного эксперта?
по результатам голосования ( 1 - против (komposter), 0 - за, остальные - воздержались ) принято решение не разводить мусор про многосимвольную торговлю в этой ветке =)
Если кому-нибудь будет всё-таки интересно, пишите - библиотекой поделюсь ;-|
Чтобы использовать:
1. Записать этот файл с расширением mqh, Tracert.mqh в папку experts\include\
2. Добавить в своего советника в самом начале строчку #include <Tracert.mqh>
3. В самом начале в блоке start() вставить функцию SetTrace();
int start() { int ticket, total,totalExpert; //------------------------------------------------------ // ради упрощения и ускорения кода, сохраним необходимые // данные индикаторов во временных переменных SetTrace();4. После прогона советника открыть файл и получить что-то вроде этого:
Сам код утилиты:
//+------------------------------------------------------------------+ //| Tracert.mq4 | //| Rosh | //| http://forexsystems.ru/phpBB/index.php | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "http://forexsystems.ru/phpBB/index.php" //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ double tr_AOPLong,tr_AOPShort; double tr_LongLots,tr_ShortLots; int tr_CurrLongOrders,tr_CurrShortOrders; int tr_Total,tr_Counter; int tr_PrevLongOrders,tr_PrevShortOrders; int tr_CurrTotalOpenedOrders,tr_PrevTotalOpenedOrders; double tr_CurrBalance,tr_PrevCurrBalance; color tr_ProfitColor=Lime, tr_LossColor=DeepPink,tr_LongAOPColor=Blue,tr_ShortAOPColor=Red, tr_CurrCloseColor; int tr_CloseLabelArrow=108, tr_AOPLabelArrow=159; bool tr_CloseLong,tr_CloseShort; double tr_CloseLabelPrice; int tr_CloseLabelShift=20; int tr_CounterCloseLabel=0,tr_CounterAOPLabel=0; int tr_Bars; void SetTrace() { //---- if (IsTesting()&&(tr_Bars!=Bars)) { tr_CloseLong=false; tr_CloseShort=false; tr_AOPLong=0.0; tr_AOPShort=0.0; tr_LongLots=0.0; tr_ShortLots=0.0; tr_CloseLabelShift=iATR(NULL,0,50,1)*3.0/10.0/Point; if (tr_CurrBalance==0.0) { tr_CurrBalance=AccountBalance(); tr_PrevCurrBalance=AccountBalance(); } //----------------Проверка открытых позиций --------------------------- tr_CurrLongOrders=0; tr_CurrShortOrders=0; tr_CurrTotalOpenedOrders=0; tr_Total=OrdersTotal(); if (tr_Total>0)// есть открытые позиции { for (tr_Counter=0;tr_Counter<tr_Total;tr_Counter++)// подсчет открытых позиций { OrderSelect(tr_Counter, SELECT_BY_POS, MODE_TRADES); if (OrderType()==OP_BUY) { tr_CurrLongOrders++; tr_AOPLong=tr_AOPLong+OrderLots()*OrderOpenPrice(); tr_LongLots=tr_LongLots+OrderLots(); } if (OrderType()==OP_SELL) { tr_CurrShortOrders++; tr_AOPShort=tr_AOPShort+OrderLots()*OrderOpenPrice(); tr_ShortLots=tr_ShortLots+OrderLots(); } }// подсчет открытых позиций //--------------- усреднение --------------------- if (tr_CurrLongOrders>0) tr_AOPLong=tr_AOPLong/tr_LongLots; if (tr_CurrShortOrders>0)tr_AOPShort=tr_AOPShort/tr_ShortLots; //--------------- усреднение --------------------- if (tr_AOPLong>0.0) { ObjectCreate("AOP"+tr_CounterAOPLabel,OBJ_ARROW,0,Time[1],tr_AOPLong);// не совсем корректно, но пока пойдет ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_ARROWCODE,tr_AOPLabelArrow); ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_COLOR,tr_LongAOPColor); tr_CounterAOPLabel++; } if (tr_AOPShort>0.0) { ObjectCreate("AOP"+tr_CounterAOPLabel,OBJ_ARROW,0,Time[1],tr_AOPShort);// не совсем корректно, но пока пойдет ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_ARROWCODE,tr_AOPLabelArrow); ObjectSet("AOP"+tr_CounterAOPLabel,OBJPROP_COLOR,tr_ShortAOPColor); tr_CounterAOPLabel++; } // Print("Long=",tr_CurrLongOrders," tr_AOPLong=",tr_AOPLong," *** Short=",tr_CurrShortOrders," tr_AOPShort=",tr_AOPShort); tr_CurrTotalOpenedOrders=tr_CurrLongOrders+tr_CurrShortOrders; if ((tr_CurrTotalOpenedOrders!=tr_PrevTotalOpenedOrders)||(tr_PrevLongOrders!=tr_CurrLongOrders)||(tr_PrevShortOrders!=tr_CurrShortOrders)) // изменилось колчиство ордеров в рынке { if (tr_PrevLongOrders>tr_CurrLongOrders) // изменилось число ордеров в Long { tr_CloseLong=true; tr_CloseLabelPrice=High[1]+tr_CloseLabelShift*Point; } if (tr_PrevShortOrders>tr_CurrShortOrders) // изменилось число ордеров в Short { tr_CloseShort=true; tr_CloseLabelPrice=Low[1]-tr_CloseLabelShift*Point; } tr_PrevLongOrders=tr_CurrLongOrders; tr_PrevShortOrders=tr_CurrShortOrders; tr_PrevTotalOpenedOrders=tr_CurrTotalOpenedOrders; } }// есть открытые позиции //---------------- Проверка изменения Баланса tr_CurrBalance=AccountBalance(); if (tr_CurrBalance!=tr_PrevCurrBalance)// проверка изменения Balance { if (tr_CurrBalance-tr_PrevCurrBalance>0.0) tr_CurrCloseColor=tr_ProfitColor; else tr_CurrCloseColor=tr_LossColor; tr_PrevCurrBalance=tr_CurrBalance; //------------------ установка Метки закрытия -------------------- ObjectCreate("Close"+tr_CounterCloseLabel,OBJ_ARROW,0,Time[1],tr_CloseLabelPrice); ObjectSet("Close"+tr_CounterCloseLabel,OBJPROP_ARROWCODE,tr_CloseLabelArrow); ObjectSet("Close"+tr_CounterCloseLabel,OBJPROP_COLOR,tr_CurrCloseColor); tr_CounterCloseLabel++; //------------------ установка Метки закрытия -------------------- }// проверка изменения Balance }//(IsTesting()) //---- tr_Bars=Bars; return(0); } //+------------------------------------------------------------------+Использовать - так же. Просто поменять в строках инклуд старые имена на новые
файлы находятся на http://forum.viac.ru/viewtopic.php?t=2973
Не могли бы Вы выложить все эти файлы и последние и более ранние где-то на виаке или альпари или форексситемс или финлисте - в общем там, куда можно прикрепить файлы. Да и найти легче будет. Заранее спасибо.
Не могли бы Вы выложить все эти файлы и последние и более ранние где-то на виаке или альпари или форексситемс или финлисте - в общем там, куда можно прикрепить файлы. Да и найти легче будет. Заранее спасибо.
http://forum.viac.ru/viewtopic.php?t=2973
описания с инструкциями перенесу позже...
последнее обновление - 13.07.2005 14:09
скорость тестирования возросла более чем в 10 раз
Изменений - куча. Причём, огромная.
Ошибкоустойчивость на абсолютно новом уровне, информация более полная, интерфейс более дружественный ;) ...
В общем, можно сказать, что это совсем новая библиотека =)
Пользуйтесь на здоровье ;)