Aiuto per la codifica - pagina 242

 
Mastercash:
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

File:
_test_mc.mq4  3 kb
 
mladen:
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 apertura

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);

}

 
BlackCoq:
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 OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

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)

 
mladen:
Prova qualcosa come questo :
double OpenOrderPrice(double priceToCompareTo, double priceDeviation)

{

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?

 
BlackCoq:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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"

 
mladen:
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.

//+------------------------------------------------------------------+//| expert start function |

//+------------------------------------------------------------------+

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)

//----
 
BlackCoq:
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.

//+------------------------------------------------------------------+//| expert start function |

//+------------------------------------------------------------------+

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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

 
mladen:
C'è un errore nel codice della funzione. Ho dato per scontato che OrderSelect() lavorasse sulla posizione e non l'ho controllato. Usa questo:
double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

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.

File:
564.mq4  10 kb
 
sulaimoney:
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

File:
564_1.mq4  10 kb
Motivazione: