Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Penso che il modo migliore per farlo NON sia usare l'indicatore. È solo il modo più semplice. Per iniziare è abbastanza buono.
State guardando le modifiche che ho fatto all'indicatore. Se vuoi usare questo, assicurati di scrivere il nome corretto nel tuo codice.
Finché sai in quale buffer si trova l'informazione che vuoi, non importa quanti indicatori ci siano nel codiceOk, quindi stai dicendo che il più semplice non è necessariamente il migliore...e che il modo migliore sarebbe quello di scrivere l'indicatore all'interno dell'EA...ma per farlo seguendo gli esempi delle lezioni l'unica parte che diceva di copiare nell'EA era la parte della funzione di iterazione e i buffer sono nella parte della funzione di inizializzazione del codice...quindi devo copiare tutto il codice dell'indicatore nell'EA? Come faccio a farlo nel modo migliore?...con l'indicatore nell'EA? Potresti mostrarmi per favore? Penso che sto imparando. Mi piace!
Ok, quindi stai dicendo che il più semplice non è necessariamente il migliore...e che il modo migliore sarebbe quello di scrivere l'indicatore all'interno dell'EA...ma per farlo seguendo gli esempi delle lezioni l'unica parte che diceva di copiare nell'EA era la parte della funzione di iterazione e i buffer sono nella parte della funzione di inizializzazione del codice...quindi devo copiare tutto il codice dell'indicatore nell'EA? Come faccio a farlo nel modo migliore?...con l'indicatore nell'EA? Potresti mostrarmi per favore?
Certo che no. Solo la parte logica. In realtà ho un esempio che fa proprio questo (ho provato a scriverlo io stesso, ma ora sto lavorando su un nuovo modo di guardare il prezzo, e mi sta prendendo tutto il tempo)
Potete averlo qui. (non funziona bene, ho bisogno di tempo per sistemarlo, ma potete vedere come combinare il codice insieme)
In questo EA è possibile impostare il TF che si desidera raggiungere il bordo allo stesso tempo, o utilizzare solo un TF
Grande!!! Hai avuto l'idea!!!!
Funzionerà perfettamente. e se volete controllare che 5M e 15M raggiungano il bordo allo stesso tempo, potete ottenere i valori di ogni TF e testarli insieme.
Ma lascia questo per dopo....Ho un buon maestro.
Ora che ho 'questa' idea illuminami il resto della strada per fare questo nel modo 'migliore' e scrivere l'indicatore all'interno dell'EA...l'ho fatto in una certa misura già.... ma non ho avuto i buffer copiati nell'EA...immagino che debba essere inserito eh?
quanto di questo deve essere effettivamente copiato nell'EA?
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Red
#property indicator_color2 Black
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Blue
double upper[], middle1[], middle2, lower[];
double Xup[], Xdown[];
extern int period = 34;
int init()
{
SetIndexStyle(0,DRAW_LINE,EMPTY,2);
SetIndexShift(0,0);
SetIndexDrawBegin(0,0);
SetIndexBuffer(0,upper);
SetIndexStyle(1,DRAW_LINE,EMPTY,2);
SetIndexShift(1,0);
SetIndexDrawBegin(1,0);
SetIndexBuffer(1,middle1);
SetIndexStyle(2,DRAW_LINE,EMPTY,2);
SetIndexShift(2,0);
SetIndexDrawBegin(2,0);
SetIndexBuffer(2,lower);
SetIndexStyle(3,DRAW_ARROW,EMPTY,2);
SetIndexArrow(3, 162);
SetIndexShift(3,0);
SetIndexDrawBegin(3,0);
SetIndexBuffer(3,Xdown);
SetIndexStyle(4,DRAW_ARROW,EMPTY,2);
SetIndexArrow(4, 162);
SetIndexShift(4,0);
SetIndexDrawBegin(4,0);
SetIndexBuffer(4,Xup);
//---- indicators
//----
return(0);
}Forse dovrei farlo come mi hai mostrato per ora e chiamare l'indicatore....it è più semplice.
Ho un buon insegnante.
Ora che ho 'questa' idea illuminami il resto della strada per fare questo nel modo 'migliore' e scrivere l'indicatore all'interno dell'EA...l'ho fatto in una certa misura già.... ma non ho avuto i buffer copiati nell'EA...immagino che debba essere inserito eh?
quanto di questo deve essere effettivamente copiato nell'EA?
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
.......
//---- indicators
//----
return(0);
}Nessuna. Questa non è la logica, questa è la parte visiva dell'indicatore
Ci vorranno due post per mostrare tutto quello che ho fatto finora....site non accetta tutto in una volta... non lasciate che vi sommerga di informazioni... voglio solo mostrarvi quello che ho fatto finora...
prima metà...
//| EMA_CROSS_2.mq4 |
//| Coders Guru |
//| https://www.forex-tsd.com |
//+------------------------------------------------------------------+
// ultima versiune cu micro lots! H1 si D1
#property copyright "Coders Guru"
#property link "https://www.forex-tsd.com"
//---- Trades limits
extern double
TakeProfit = 10,
TrailingStop = 20,
StopLoss = 20;
extern bool
UseStopLoss = false;
//---- EMAs paris
extern int
ShortEma = 1,
LongEma = 5;
//---- Crossing options
extern bool
immediate_trade = true, //Open trades immediately or wait for cross.
reversal = false, //Use the originally reversal crossing method or not
ConfirmedOnEntry = false;
//---- Money Management
extern double
Lots = 1,
HedgePercent = 1; // Used to calcualte the what percent of the lots the user wants to be
// used in the hedged position
extern bool
MM = true, //Use Money Management or not
AccountIsMicro = true; //Use Micro-Account or not
extern int
StartHour = 0, //Indicates when the user wants the EA to start trading
StopHour = 23; //Indicates when the user wants the EA to stop trading
extern int
Risk = 10; //10%
extern int
MAGICMA = 20060301;
extern bool
Show_Settings = true;
//---- Global varaibles
static int
TimeFrame = 0;
datetime
CheckValueTime;
//---- Trend bands
double upper[], middle1[], middle2, lower[];
double Xup[], Xdown[];
extern int period = 34;
//---- Filter Parameters
extern double longrange = 25;
extern double shortrange = 20;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if(Show_Settings) Print_Details();
else Comment("");
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
TimeFrame=Period(); //Prevent counting the cross while the user changing the timeframe
return(0);
}
bool isNewSumbol(string current_symbol)
{
//loop through all the opened order and compare the symbols
int total = OrdersTotal();
for(int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
string selected_symbol = OrderSymbol();
if (current_symbol == selected_symbol)
return (False);
}
return (True);
}
int Crossed (double line1 , double line2)
{
static int last_direction = 0;
static int current_direction = 0;
if(TimeFrame!=Period())
{
TimeFrame=Period();
return (0);
}
if(line1>line2)current_direction = 1; //up
if(line1<line2)current_direction = 2; //down
if(immediate_trade==false)
{
if(last_direction == 0) //first use
{
last_direction = current_direction;
return(0);
}
}
if(current_direction != last_direction) //changed
{
last_direction = current_direction;
return (last_direction);
}
else
{
return (0); //not changed
}
}
//--- Bassed on Alex idea! More ideas are coming
double LotSize()
{
double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;
if(AccountIsMicro==false) //normal account
{
if (lotMM < 0.1) lotMM = Lots;
if ((lotMM > 0.5) && (lotMM < 1)) lotMM=0.5;
if (lotMM > 1.0) lotMM = MathCeil(lotMM);
if (lotMM > 100) lotMM = 100;
}
else //micro account
{
if (lotMM < 0.01) lotMM = Lots;
if (lotMM > 1.0) lotMM = MathCeil(lotMM);
if (lotMM > 100) lotMM = 100;
}
return (lotMM);
}
string BoolToStr ( bool value)
{
if(value) return ("True");
else return ("False");
}
void Print_Details()
{
string sComment = "";
string sp = "----------------------------------------\n";
string NL = "\n";
sComment = sp;
sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";
sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + " | ";
sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + " | ";
sComment = sComment + "UseStopLoss=" + BoolToStr(UseStopLoss) + NL;
sComment = sComment + sp;
sComment = sComment + "immediate_trade=" + BoolToStr(immediate_trade) + " | ";
sComment = sComment + "reversal=" + BoolToStr(reversal) + NL;
sComment = sComment + sp;
sComment = sComment + "Lots=" + DoubleToStr(Lots,0) + " | ";
sComment = sComment + "MM=" + BoolToStr(MM) + " | ";
sComment = sComment + "Risk=" + DoubleToStr(Risk,0) + "%" + NL;
sComment = sComment + sp;
Comment(sComment);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
secondo tempo...
//| expert start function |
//+------------------------------------------------------------------+
int start() {
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int limit;
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
double avg;
for(int x=0; x<limit; x++) {
Xdown[x] = 0; Xup[x] = 0;
middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line
middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
avg = findAvg(period, x);
upper[x] = middle2 + (3.5*avg);
lower[x] = middle2 - (3.5*avg);
if (MathAbs(upper[x] - High[x]) < 2*Point)
{
Xdown[x] = upper[x];
if (NewBar() && x == 0)
Alert(Symbol()," ",Period()," reach upper edge");
}
if (MathAbs(lower[x] - Low[x]) < 2*Point)
{
Xup[x] = lower[x];
if (NewBar() && x == 0)
Alert(Symbol()," ",Period()," reach lower edge");
}
}
return(0);
}
//+------------------------------------------------------------------+
double findAvg(int period, int shift) {
double sum=0;
for (int x=shift;x<(shift+period);x++) {
sum += High[x]-Low[x];
}
sum = sum/period;
return (sum);
}
bool NewBar()
{
static datetime dt = 0;
if (dt != Time[0])
{
dt = Time[0];
return(true);
}
return(false);
//end of trend bands custom indicator
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
{
if(Hour() >= StartHour && Hour() <= StopHour){ //Nothing will happen unless the time is within the trading time
int cnt, ticket, total;
double SEma, LEma, SEmaLAST, LEmaLAST;
string comment = "";
if(reversal==true) comment = "EMA_CROSS_Counter-Trend";
if(reversal==false) comment = "EMA_CROSS_Trend-Following";
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<1)
{
Print("TakeProfit less than 1");
return(0); // check TakeProfit
}
static int isCrossed = 0;
if(ConfirmedOnEntry)
{
if(CheckValueTime==iTime(NULL,TimeFrame,0)) return(0); else CheckValueTime = iTime(NULL,TimeFrame,0);
SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
LEma = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,1);
SEmaLAST = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
LEmaLAST = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,2);
if(SEmaLASTLEma) isCrossed = 1;
if(SEmaLAST>LEmaLAST && SEma<LEma) isCrossed = 2;
}
else
{
SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);
LEma = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,0);
isCrossed = Crossed (LEma,SEma);
}
if(reversal==false)
{
if(isCrossed==1) isCrossed = 2;
else if(isCrossed==2) isCrossed = 1;
}
if(MM==true) Lots = LotSize(); //Adjust the lot size
total = OrdersTotal();
// TRAILING STOP
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // long position is opened
{
// check for trailing stop
if(TrailingStop>0){
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// check for trailing stop
if(TrailingStop>0){
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
// ENTRY
if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)
{
double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position
if(isCrossed == 1 && Point < toplinevalue-longrange)
{
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
else
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,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());
//###################################################################### the added code starts here
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);
else
ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,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());
//###################################################################### ends here
return(0);
}
if(isCrossed == 2)
{
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);
else
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,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());
//###################################################################### the added code starts here
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
else
ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,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());
//###################################################################### ends here
return(0);
}
return(0);
}
return(0);
}
return(0);
}
}
//+------------------------------------------------------------------+ora quando arrivo a questa linea...
if(isCrossed == 1 && Point < toplinevalue-longrange)
qui è dove voglio mettere il valore dell'indicatore per la barra corrente...
come faccio a chiamare l'informazione fuori dal codice sopra per la barra corrente quando è già dentro l'EA? In realtà l'avevo già fatto ieri prima che tu mi mostrassi come chiamare l'indicatore con l'icustom(). Prima di annullare tutto quello che ho già fatto mi chiedo se può essere completato così com'è e funzionare meglio che annullare tutto e poi fargli chiamare l'indicatore?
Come ho detto, non hai a che fare con la storia. stai riempiendo l'intero buffer solo per ottenere l'ultimo valore
Xdown[x] = 0; Xup[x] = 0;
middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line
middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
avg = findAvg(period, x);
upper[x] = middle2 + (3.5*avg);
lower[x] = middle2 - (3.5*avg);
if (MathAbs(upper[x] - High[x]) < 2*Point)
{
Xdown[x] = upper[x];
if (NewBar() && x == 0)
Alert(Symbol()," ",Period()," reach upper edge");
}
if (MathAbs(lower[x] - Low[x]) < 2*Point)
{
Xup[x] = lower[x];
if (NewBar() && x == 0)
Alert(Symbol()," ",Period()," reach lower edge");
}
}
[/PHP]
Why not just calculate the last bar
[PHP]
int x = 0;
//Xdown[x] = 0; Xup[x] = 0;
//
// we are not using middle line
//middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line
double middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
avg = findAvg(period, x);
double upper = middle2 + (3.5*avg);
double lower = middle2 - (3.5*avg);
if (MathAbs(upper - High) < 2*Point)
{
// no need just alert (or open a trade)
//Xdown[x] = upper[x];
if (NewBar())
Alert(Symbol()," ",Period()," reach upper edge");
}
if (MathAbs(lower - Low) < 2*Point)
{
//Xup[x] = lower[x];
if (NewBar()) // I remove " && x == 0" because we know that x == 0
Alert(Symbol()," ",Period()," reach lower edge");
}
}
double middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
avg = findAvg(period, x);
double upper = middle2 + (3.5*avg);
double lower = middle2 - (3.5*avg); [/php]
ok that makes sense, I don't need the whole array just the current bar, so this (above code) is all that is required to calculate the top and bottom lines that needs to be in the EA?
this part (code below) confused me. I don't get the logic of it..I know it's sending alerts when the line is crossed but that's not what I need to use this for. I don't understand how it works to make the Xdown = upper , nor do I understand the logic of upper - high <2*point . To me it is a mass of confusion.
all I need to do with the top and bottom lines is know where they are in the current bar so I can determine how close to allow the point to approach them before it disallows the trade? that is the logic I want to create with the right code. I don't need alerts. Also I have not been able to find 'newbar()' in the metaeditor dictionary and the search function in metaeditor isn't working for me it's not responsive.
[php] if (MathAbs(upper - High) < 2*Point)
{
// no need just alert (or open a trade)
//Xdown[x] = upper[x];
if (NewBar())
Alert(Symbol()," ",Period()," reach upper edge");
}
if (MathAbs(lower - Low) < 2*Point)
{
//Xup[x] = lower[x];
if (NewBar()) // I remove " && x == 0" because we know that x == 0
Alert(Symbol()," ",Period()," reach lower edge");
}
}Ho guardato il MEdictionary e vedo un 'bool IsTradeAllowed( )' è quello che potrei usare per limitare l'apertura dei trade se è troppo vicino?
Se vuoi sapere se la linea superiore è vicina al prezzo, un modo per scoprirlo è se la differenza tra loro è piccola (diciamo 2 punti).
Non mi interessa (il che non è una buona idea) se il prezzo è sotto la linea o sopra la linea. Per me 2 punti di distanza sono sufficienti. quindi la differenza è
superiore - Alto vi darà la differenza ma non in punti (il suo qualcosa come 0,0004 o -0,0004). Per essere sicuri che la diff sia positiva stiamo usando la finzione MathAbs che restituisce il valore assoluto (positivo). Ora dobbiamo controllare se è meno di 2 punti. la parola riservata Point restituirà il valore quando il prezzo sale di 1 pip. È diverso per ogni coppia.
Mettete tutto insieme
se (MathAbs(upper - High) < 2*Point) significa se la differenza è inferiore a 2 pip, e per noi è abbastanza vicina
In realtà usare High non va bene, perché l'High forse è sopra, ma il prezzo corrente è lontano. Dobbiamo usare Ask invece di High (nell'indicatore dobbiamo usare Close[x])
Per assicurarci che il prezzo sia sopra la linea possiamo fare così
if ((Ask > upper) && (Ask - upper < 2 * Point))
.....(alert or open a trade)
L'ho ridotto a questo... ma aspetta...
se questo è solo usando la semplice media mobile di questa barra moltiplicata per 3,5 per trovare un punto alto. Come è possibile che il punto possa mai raggiungerlo? Il valore della linea non viene calcolato dalla stessa barra che dovrebbe toccarlo per segnalarlo? Man mano che la barra sale, sale anche la linea di confine?
double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, 0);// only used to calculate outer bands
double avg;
avg = findAvg(back, x);
double upper = middle2 + (3.5*avg);
double lower = middle2 - (3.5*avg);