Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 6
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пока что я не вижу никаких проблем (ориентируясь на код).
Но с точки зрения логики, посмотрите на это
if(isCrossed == 1 && Ask < UpLevel)
Вы не проверяете, что они близки, только то, что цена ниже линииЭто то, что я хотел... фильтровать... Я хочу использовать линию как способ запретить сделки. Таково было намерение. Мне не нужно делать способ, чтобы увидеть, если он близок к линии, если я могу изменить ширину самой линии, я могу просто использовать саму линию в качестве ограничителя. Изменение ширины полос будет таким же, как если бы был другой фактор, проверяющий, насколько близко он подошел к линии. Сделав это условием входа, он фильтрует или должен остановить открытие ордеров на покупку, если они не находятся ниже верхней линии, или ордеров на продажу, если они находятся выше нижней линии.
Я не совсем понимаю, почему это может привести к ошибкам ордеров?
похоже, что ошибка связана с неправильным размером лота, имеющим какое-то отношение к параметрам ММ...
Я несколько меняю фокус... возвращаюсь к своему первоначальному фокусу...
Я пришел к выводу, что индикатор трендовых полос не даст того эффекта фильтрации, который я хочу. Он просто не будет.
Первоначально я рассматривал канальный индикатор 'ang_AutoCh_HL-v1'. Я вижу, что он даст мне эффект фильтрации, который я хочу, но у него нет буферов для вызова...so.....
могу ли я сделать буферы в нем? для значений линий? объекта 1 и объекта 2? чтобы я мог использовать их как поддержку и сопротивление в советнике?
Вот индикатор...
//----------------------------------
#property indicator_chart_window
//----------------------------------
extern int Hours=24;
extern color col=SkyBlue;
//------------------
double lr,lr0,lrp;
double sx,sy,sxy,sx2,aa,bb;
int p,sName,fs;
int f,f0,f1;
double dh,dl,dh_1,dl_1,dh_2,dl_2;
int ai_1,ai_2,bi_1,bi_2;
double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;
double price_p1,price_p0,price_p2,price_01,price_00,price_02;
int p1,p0,p2,fp;
//*****************************************
int init() {
p=Hours*60/Period();
if (fs==0) {sName=CurTime(); fs=1;}
return(0);}
//*******************************
int deinit() {
ObjectDelete("1"+sName);
ObjectDelete("0"+sName);
ObjectDelete("2"+sName); }
//*******************************
int start() {
int i,n;
//------------------------------------------------------------------------------
if (f==1) {
p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName,OBJPROP_TIME1));
p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName,OBJPROP_TIME1));
p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName,OBJPROP_TIME1));
if (fp==0 && p!=p1) {p=p1; fp=1;}
if (fp==0 && p!=p0) {p=p0; fp=1;}
if (fp==0 && p!=p2) {p=p2; fp=1;}
}
//====================================================
sx=0; sy=0; sxy=0; sx2=0;
for (n=0; n<=p; n++) {sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);}
aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);
//----------------------------------------------------
for (i=0; i<=p; i++) {
lr=bb+aa*i;
dh=High-lr; dl=Low-lr;
//----------------------------------------------------
if (i<p/2) {if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}
if (dh>=dh_1) {dh_1=dh; ai_1=i;}
if (dl<=dl_1) {dl_1=dl; bi_1=i;}}
//----------------------------------------------------
if (i>=p/2) {if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}
if (dh>=dh_2) {dh_2=dh; ai_2=i;}
if (dl<=dl_2) {dl_2=dl; bi_2=i;}}}
//-------------------------------------
lr0=bb; lrp=bb+aa*(i+p);
//===================================================
if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;
if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;
if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {if (MathAbs(dh_1-dh_2)=MathAbs(dl_1-dl_2)) f=2;}
//=================================================
if (f==1) {
for (n=0; n<=20; n++) { f1=0;
for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
if (i==0 || i==p/2) dhm=0.0;
if (High-hai>dhm && i<p/2) {ai_1=i; f1=1;}
if (High-hai>dhm && i>=p/2) {ai_2=i; f1=1;} }
if (f==0) break;}
//----------------------------
for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
dli=Low-hai;
if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}
ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);
hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);
//----------------------------
price_p1=hap;
price_p0=hap+dlm/2;
price_p2=hap+dlm;
price_01=ha0;
price_00=ha0+dlm/2;
price_02=ha0+dlm;
}
//=================================================
if (f==2) {
for (n=0; n<=20; n++) { f1=0;
for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);
if (i==0 || i==p/2) dlm=0.0;
if (Low-lai<dlm && i<p/2) {bi_1=i; f1=1;}
if (Low-lai=p/2) {bi_2=i; f1=1;}}
if (f==0) break;}
//----------------------------
for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);
dhi=High-lai;
if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}
la0=Low*(0-bi_2)/(bi_1-bi_2)+Low*(0-bi_1)/(bi_2-bi_1);
lap=Low*(p-bi_2)/(bi_1-bi_2)+Low*(p-bi_1)/(bi_2-bi_1);
//----------------------------------------------------------------
price_p1=lap;
price_p0=lap+dhm/2;
price_p2=lap+dhm;
price_01=la0;
price_00=la0+dhm/2;
price_02=la0+dhm;
}
//===================================================================================
ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);
ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);
ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);
//-----------------------------------------------------------------
ObjectSet("1"+sName,OBJPROP_COLOR,col);
ObjectSet("0"+sName,OBJPROP_COLOR,col);
ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet("2"+sName,OBJPROP_COLOR,col);
//---------------------------------------------
ObjectSet("1"+sName,OBJPROP_TIME1,Time[p]);
ObjectSet("1"+sName,OBJPROP_PRICE1,price_p1);
ObjectSet("1"+sName,OBJPROP_TIME2,Time[0]);
ObjectSet("1"+sName,OBJPROP_PRICE2,price_01);
ObjectSet("0"+sName,OBJPROP_TIME1,Time[p]);
ObjectSet("0"+sName,OBJPROP_PRICE1,price_p0);
ObjectSet("0"+sName,OBJPROP_TIME2,Time[0]);
ObjectSet("0"+sName,OBJPROP_PRICE2,price_00);
ObjectSet("2"+sName,OBJPROP_TIME1,Time[p]);
ObjectSet("2"+sName,OBJPROP_PRICE1,price_p2);
ObjectSet("2"+sName,OBJPROP_TIME2,Time[0]);
ObjectSet("2"+sName,OBJPROP_PRICE2,price_02);
//==================================================================
f=1; p1=p; p0=p; p2=p; fp=0;
//*************************************************************************************
return(0);}
//=====================================================================================[/PHP]
here is what I'm trying to add a buffer so I can extract the values I need...
#property copyright "ANG3110@latchess.com"
//----------------------------------
#property indicator_chart_window
//----------------------------------
extern int Hours=24;
extern color col=SkyBlue;
//------------------
double ExtBufferResistance[];
double ExtBufferMiddle[];
double ExtBufferSupport[];
double lr,lr0,lrp;
double sx,sy,sxy,sx2,aa,bb;
int p,sName,fs;
int f,f0,f1;
double dh,dl,dh_1,dl_1,dh_2,dl_2;
int ai_1,ai_2,bi_1,bi_2;
double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;
double price_p1,price_p0,price_p2,price_01,price_00,price_02;
int p1,p0,p2,fp;
//*****************************************
int init() {
p=Hours*60/Period();
if (fs==0) {sName=CurTime(); fs=1;}
SetIndexBuffer (4, ExtBufferResistance); //--resistance line
SetIndexBuffer (5, ExtBufferMiddle); //--middle line
SetIndexBuffer (6, ExtBufferSupport); //--support line
return(0);}
//*******************************
//===================================================================================
ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);
ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);
ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);
//------------------make indicator buffer for EA-------------------------------------
somehow get object 1 to put it's value into buffer 4
somehow get object 0 to put it's value into buffer 5
somehow get object 2 to put it's value into buffer 6
//------------------------draw chart-------------------------------------------------
[/php]
and then upgrade this EA....
[PHP]#property copyright "Copyright 2005, Chris Battles."
#property link "cbattles@neo.rr.com"
extern double TrailingStop = 5;
extern double TrailingStopTrigger = 19;
extern double StopLoss = 186;
extern double TakeProfit = 250;
extern double Lots = 0.4;
//---- ang_AutoCh_HL-v1 and Filter Parameters
extern int Hours=24;
extern color col=SkyBlue;
extern double TF = 30; //--which bar period for the custom indicator to use
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start(){
int cnt, ticket;
if(Bars<100){
Print("bars less than 100");
return(0);
}
double ema1a=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
double ema2a=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,0);
double ema3a=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0);
double ema1b=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double ema2b=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
double ema3b=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1);
//----------channel filter
double resistance = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 4, 0);
double support = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 6, 0);
//--- end channel filter
and then make the order logic have second condition for entry...
[PHP]if (ema3bema1a && Ask < resistance){
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
if (ema3b>ema1b && ema3a support){
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);
if(ticket>0) {
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);На самом деле, мой камень преткновения - это получение значений из индикатора, чтобы советник мог их использовать... Я думаю, я смогу справиться с остальным, если вы просто покажете мне, как получить значения из индикатора в советник.
Я действительно не знаю, что я делаю с буферами. Я бросаю строки setbuffer и даже не знаю, нужно ли это или нет.
Привет...
Индикатор с буферами,
Вы можете вызвать res && sup, как показано ниже:
double resistance = iCustom(NULL,TF, "Channel",24,col,0,0);
double support = iCustom(NULL,TF, "Channel",24,col,2,0);
РафЭто то, о чем я говорю.... Не могу дождаться, когда попробую это, чтобы посмотреть, сработает ли это.
Теперь я должен поместить эти вещи в верхней части ea? чтобы сказать индикатору, какие параметры он использует?
//---- Параметры канала и фильтра
extern int Hours=24;
extern color col=SkyBlue;
extern double TF = 30; //--какой период бара использовать для пользовательского индикатора
и затем...
double resistance = iCustom(NULL,TF, "Channel",Hours,col,0,0);
double support = iCustom(NULL,TF, "Channel",Hours,col,2,0);
Ок, я снова получаю эту ошибку 130, что это такое?
О да, стоп лосс слишком близко... хорошо...
Здравствуйте...
Индикатор с буферами,
channel.mq4
Вы можете вызвать res && sup как показано ниже:
double resistance = iCustom(NULL,TF, "Channel",24,col,0,0);
double support = iCustom(NULL,TF, "Channel",24,col,2,0);
Raff
Новая проблема...
У меня есть несколько версий стопов, работающих на этом... Просадки происходят из-за того, что триггер трейлинг-стопа не срабатывает. Когда он не срабатывает, тогда отступающий "equity stop" закрывает позицию, и именно это причиняет боль...
Я вижу по множеству мелких просадок, что когда срабатывает трейлинг-стоп, это не наносит почти такого же ущерба эквити счета. Он может выдержать многие из этих видов потерь и компенсировать их, но он не может преодолеть большие потери от закрытия эквити стопа.
so....
Есть ли способ закрыть позицию, если бар, следующий за открытием, не движется достаточно, чтобы задействовать трейлинг-стоп?
Я приступил к этому, теперь я называю текущий период, а также три предыдущих периода по линиям скользящих средних. В принципе, я думал о том, что сигнал и подтверждение одного бара могут быть получены на трех периодах, предшествующих текущему, а текущий период может быть использован для того, чтобы увидеть, достаточно ли он сдвинулся, чтобы сработать трейлинг-стоп. Я думал, что это условие можно добавить в качестве || или условия к эквити-стопу, который закрывает все открытые ордера.
Меня озадачило то, как определить, достаточно ли он сдвинулся для срабатывания трейлинг-стопа, в зависимости от того, что если он идет в длинную позицию, то должен двигаться вверх, а если в короткую, то вниз. Поэтому при определении срабатывания трейлинг-стопа необходимо обращать внимание на то, длинная это позиция или короткая, чтобы знать, в какую сторону нужно двигаться, чтобы сработать. Я не уверен, как это определить.
Я могу представить себе этот отчет, в котором большие просадки выглядят не больше, чем маленькие, и если бы это было так, то он был бы прибыльным.
нужно еще одно уточнение...
это закрытие убыточных позиций до того, как они станут большими... это также закрытие ВЫИГРЫШНЫХ позиций до того, как они станут большими.
Он должен закрывать позицию, только если она не сдвинулась достаточно в первые десять минут, чтобы сработал трейлинг-стоп... для этого нужно сдвинуться всего на 1 пункт, я думаю... так что я не прошу многого в первые десять минут. На самом деле я только хочу убедиться, что он не повернет хвост и не вернется в позицию сразу после ее открытия. Это те, кто теряет.
so.... можно ли сделать так, чтобы он определял, сработал ли трейлинг стоп, и если да, то пусть он работает!!! пусть трейлинг стоп закрывает его, а не закрывает как функция времени. Параметр закрытия по времени не предназначен для того, чтобы быть основной стратегией закрытия, он просто обрабатывает закрытие, пока трейлинг-стоп не возьмет на себя ответственность.
Это не делает того, что я задумал... Я не могу разобраться в этих результатах...
https://c.mql5.com/forextsd/forum/9/whatever3.htm
Просто просматривая его, большинство из них открыты только 10 минут или меньше (я установил его на закрытие через 10 минут, если критерии не выполнены) с очень немногими исключениями, такими как ордер #52, который открыт 19 минут и #48, который открыт 15 минут.
эта часть не работает... OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice()
не работает и это... if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
нам нужно проверить, сработал ли трейлинг-стоп. Я не хочу, чтобы закрытие происходило на основе цены. Я хочу, чтобы он закрывался на основании того, что трейлинг-стоп не сработал. Я понимаю, что первоначально я сказал, что нам нужно проверить, поднялась ли цена достаточно для срабатывания трейлинг-стопа... но я не совсем понимаю код срабатывания трейлинг-стопа или насколько это далеко... Я не знаю, будет ли это повторяться для проверки даже после указанного интервала и закроет ли это на 15 или 19 минуте, если/когда критерии bid+Profit будут равны OrderOpenPrice? Что это делает, так это делает себя доминирующим критерием закрытия вместо критерия стоп-гэпа, пока не сработает трейлинг-стоп... вот на что это похоже...
void CloseOrder()
{
double Profit=ThresholdMove*Point;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)
{
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
}
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
}
}
}
}
//+------------------------------------------------------------------+[/PHP]
Somewhere in this closing strategy there must be a way to detect if it's been triggered or not...
[PHP]//+------------------------------------------------------------------+
//| Variable End |
//+------------------------------------------------------------------+
//Check position
bool IsTrade = False;
for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
IsTrade = True;
if(OrderType() == OP_BUY) {
//Close
//+------------------------------------------------------------------+
//| Signal Begin(Exit Buy) |
//+------------------------------------------------------------------+
if (CloseBuy1_1 == CloseBuy1_2) Order = SIGNAL_CLOSEBUY;
//+------------------------------------------------------------------+
//| Signal End(Exit Buy) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//Trailing stop
if(TrailingStopMode && TrailingStop > 0) {
if(Bid - OrderOpenPrice() > Point * TrailingStop) {
if(OrderStopLoss() < Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
} else {
//Close
//+------------------------------------------------------------------+
//| Signal Begin(Exit Sell) |
//+------------------------------------------------------------------+
if (CloseSell1_1 == CloseSell1_2) Order = SIGNAL_CLOSESELL;
//+------------------------------------------------------------------+
//| Signal End(Exit Sell) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//Trailing stop
if(TrailingStopMode && TrailingStop > 0) {
if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
}
}
}В итоге, параметр timeclosing слишком агрессивен, если его не модифицировать, чтобы он работал так, как нужно.
К сожалению, у меня нет времени рассматривать весь код, но давайте рассмотрим только этот фрагмент.
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
Допустим, что цена открытия ордера = 1.2100
а прибыль составляет 0.0010
Таким образом, вы хотите закрыть короткую сделку, если ставка меньше или равна 1.2100-0.0010 = 1.2090.
Предположим, что произошел гэп вниз, и цены проскочили 1,2090, а цена предложения теперь составляет 1,2088. Согласно вашей формуле,
Bid + Profit = 1.2088 + 0.0010 = 1.2098. Это НЕ больше, чем OrderOpenPrice, даже если ваша система превысила порог прибыли. Таким образом, ордер не будет закрыт. На мой взгляд, логику условия закрытия нужно пересмотреть и переписать. Кроме того, при работе с короткими сделками следует иметь дело с ценами Ask, поскольку закрыть сделку можно только по цене ask.
Еще один совет,
Цикл подсчета for (int cnt = 0 ; cnt = 0; cnt--) или что-то подобное.
Удачи.