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
Qualcuno può dirmi cosa ho fatto di sbagliato, il codice qui sotto è 2 EMA cross over con avvisi, si rifiuta di lavorare, qualcuno può aiutarmi a compilare e lavorare su mt4 build 600 +:
#proprietà copyright "wnk"
#proprietà link "www.wnk.com"
#proprietà indicator_chart_window
#proprietà indicatore_buffer 2
#proprietà indicator_color1 Lime
#proprietà indicator_color2 Red
//--- buffer
double ExtMapBuffer1[]
double ExtMapBuffer2[]
//variabile esterna......
//+------------------------------------------------------------------+
//|funzione di inizializzazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int init()
{
//---- indicatori
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,217);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funzione personalizzata di deinizializzazione dell'indicatore |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzato |
//+------------------------------------------------------------------+
int start()
{
static datetime LastAlertTime = TimeCurrent();
int counted_bars=IndicatorCounted(),
limite;
if(counted_bars<0)
return(-1);
se(barre contate>0)
counted_bars--;
limite=Bars-counted_bars;
mentre(limite)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0);
double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1);
//aumentare gli avvisi
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limit]=High[limit]+5*Point;
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price UP");
/avvisi di vendita
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point;
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price Down");
}
return(0);
}
//+------------------------------------------------------------------+Mastercash
Provalo ora
Axel
Si può fare.
Semplicemente gli ordini aperti devono essere scansionati per il tipo desiderato e i loro prezzi aperti devono essere confrontati con il nuovo prezzo aperto desiderato o le barre in cui sono stati aperti possono essere confrontate con la barra che serve come criterio di aperturaEDIT: Sembra che abbia dimenticato di aggiungere la funzione.
Funzionerebbe scrivere una funzione come quella sotto 20 volte o giù di lì per diversi "i=OrdersTotal()-1" e poi chiamare in tutte le funzioni e abbinarle al nuovo prezzo di apertura?
doppio OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdiniTotali()-1;i>=0;i--)
{
se (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}
EDIT: Sembra che abbia dimenticato di aggiungere la funzione.
Funzionerebbe scrivere una funzione come quella sotto 20 volte o giù di lì per diversi "i=OrdersTotal()-1" e poi chiamare in tutte le funzioni e abbinarle al nuovo prezzo di apertura?
doppio OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdiniTotali()-1;i>=0;i--)
{
se (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}Prova qualcosa come questo :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Dovete passare il prezzo al quale deve essere aperto e la deviazione massima (un valore assoluto: per esempio non 5 per cinque punti, ma 5*_Point) dal prezzo, e se la differenza è minore o uguale a quella deviazione di prezzo restituirà il prezzo dell'ordine aperto a quel prezzo approssimativo. Altrimenti restituirà -1 come risultato (che significa in quel caso che non ci sono ordini con prezzi simili)
Prova qualcosa come questo :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Dovete passare il prezzo a cui deve essere aperto e la deviazione massima (un valore assoluto: per esempio non 5 per cinque punti, ma 5*_Point) dal prezzo, e se la differenza è minore o uguale a quella deviazione di prezzo, restituirà il prezzo dell'ordine aperto a quel prezzo approssimativo. Altrimenti restituirà -1 come risultato (che significa in quel caso che non ci sono ordini con prezzi simili)Quindi, se voglio controllare se ci sono ordini aperti che si discostano di 2 pip dal prezzo al quale voglio comprare, chiamo questa funzione:
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
doppio TempOrderPrice = -1;
for(int i=OrdiniTotali()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
se (MathAbs(OrderOpenPrice()-priceToCompareTo)<=deviazione di prezzo)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
pausa;
}
}
return(TempOrderPrice);
}
E poi farne un altro per gli short?
Quindi se voglio controllare se ci sono ordini aperti che si discostano di 2 pip dal prezzo a cui voglio comprare, chiamo questa funzione:
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
doppio TempOrderPrice = -1;
for(int i=OrdiniTotali()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
se (MathAbs(OrderOpenPrice()-priceToCompareTo)<=deviazione di prezzo)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
pausa;
}
}
return(TempOrderPrice);
}
E poi farne un altro per i pantaloncini?No
Tu chiami la funzione in questo modo:
se (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) permette i lunghi e
se (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) permette gli short
La chiamata dovrebbe provenire dalla tua parte di codice dove hai una logica per aprire un ordine.
Ma allora la funzione deve essere diversa (come questa):
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
La funzione copre entrambi i casi ora e non si dovrebbe cambiare il codice all'interno della funzione
___________________
PS: la variabile _Point non esiste nelle vecchie build di metatrader 4. L'esempio superiore è scritto per la nuova metatrader4. Se si usa una vecchia build (509 o precedente) allora "_Point" dovrebbe essere "Point"
No
Chiamate la funzione in questo modo:
La chiamata dovrebbe essere dalla tua parte di codice in cui hai una logica per aprire un ordine.
Ma allora la funzione deve essere diversa (come questa):
La funzione copre entrambi i casi ora e non dovresti cambiare il codice all'interno della funzione
___________________
PS: la variabile _Point non esiste nelle vecchie versioni di metatrader 4. L'esempio superiore è scritto per la nuova metatrader4. Se si utilizza una vecchia build (509 o precedente) allora "_Point" dovrebbe essere "Point".Grazie. Ho copiato la funzione nell'EA e l'ho chiamata come hai scritto, ma per qualche motivo apre le posizioni anche se ce ne sono altre entro la deviazione del nuovo prezzo. Quella funzione controlla tutti i prezzi aperti o solo l'ultimo?
Compreso l'EA qui sotto.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Grazie. Ho copiato la funzione nell'EA e l'ho chiamata come hai scritto, ma per qualche motivo apre le posizioni anche se ce ne sono altre entro la deviazione del nuovo prezzo. Quella funzione controlla tutti i prezzi aperti o solo l'ultimo?
Compreso l'EA qui sotto.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----C'è un errore nel codice della funzione. Ho dato per scontato che la funzione OrderSelect() lavorasse sulla posizione e non l'ho controllata. Usa questo:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Ora dovrebbe funzionare correttamente
C'è un errore nel codice della funzione. Ho dato per scontato che OrderSelect() lavorasse sulla posizione e non l'ho controllato. Usa questo:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
E così è. Grazie ancora per il tuo grande lavoro, Mladen.
Ciao Mladen ,
potresti per favore dare un'occhiata a questo codice sto cercando di selezionare l'ultimo ordine e aprire ulteriori ordini in base all'ultimo prezzo aperto. Tutto sembra funzionare tranne che
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
sembrano interferire l'uno con l'altro, se devo commentare uno dei due come qui sotto, l'ordine funzionerà bene.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
potete dirmi cosa sto facendo di sbagliato.
Ciao Mladen ,
potresti per favore dare un'occhiata a questo codice sto cercando di selezionare l'ultimo ordine e aprire ulteriori ordini basati sull'ultimo prezzo aperto. Tutto sembra funzionare tranne che
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
sembrano interferire l'uno con l'altro, se devo commentare uno dei due come qui sotto, l'ordine funzionerà bene.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
puoi dirmi cosa sto facendo di sbagliato.sulaimoney
Penso che il problema non fosse in queste due funzioni ma nel modo in cui la nuova metatrader 4 controlla le condizioni booleane (se state usando alcune delle nuove versioni di metatrader 4). Ho semplificato un po' il codice e ho risolto l'unico punto in cui le condizioni booleane dovevano essere rigorosamente definite. Provalo