Come codificare? - pagina 62

 
Dan7974:
Come posso codificare questo?

Se il mercato tocca (X.XX50 o X.XX00)

allora compra. Come identificare gli ultimi due numeri?

Grazie.

Questo dovrebbe farlo:

if ( Point == 0.01 ) {xPrice = Close - MathMod(Close,0.50) ; }

else { xPrice = Close - ( MathMod(100*Close,0.50)*0.01 ) ; }

P1Buffer = xPrice + Point*50;

P2Buffer = xPrice ;

P3Buffer = xPrice - Point*50;

[/CODE]

When MathMod(Close,0.50) = 0 then the price ends in 00 or 50.

Here's my indicator to identify 00 lines:

[CODE]

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

//| _TRO_00_Lines |

//| |

//| |

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

#property indicator_chart_window

#property indicator_buffers 3

#property indicator_color1 LightGray

#property indicator_color2 LightGray

#property indicator_color3 LightGray

// indicators parameters

//---- buffers

double P1Buffer[];

double P2Buffer[];

double P3Buffer[];

double xPrice ;

int myStyle = 2 ;

int myWingDing = 250 ;

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

//| Custom indicator initialization function |

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

int init()

{

SetIndexBuffer(0, P1Buffer);

SetIndexBuffer(1, P2Buffer);

SetIndexBuffer(2, P3Buffer);

SetIndexArrow(0, myWingDing);

SetIndexArrow(1, myWingDing);

SetIndexArrow(2, myWingDing);

SetIndexStyle(0, DRAW_ARROW, myStyle, 1);

SetIndexStyle(1, DRAW_ARROW, myStyle, 1);

SetIndexStyle(2, DRAW_ARROW, myStyle, 1);

SetIndexEmptyValue(0,0);

SetIndexEmptyValue(1,0);

SetIndexEmptyValue(2,0);

return(0);

}

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

//| Custom indicator deinitialization function |

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

int deinit()

{

return(0);

}

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

//| Custom indicator iteration function |

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

int start()

{

int i, dayi, counted_bars = IndicatorCounted();

//---- check for possible errors

if(counted_bars < 0)

return(-1);

//---- last counted bar will be recounted

if(counted_bars > 0)

counted_bars--;

int limit = Bars - counted_bars;

//----

for(i = limit - 1; i >= 0; i--)

{

if ( Point == 0.01 ) {xPrice = Close - MathMod(Close,1.00) ; }

else { xPrice = Close - ( MathMod(100*Close,1.00)*0.01 ) ; }

P1Buffer = xPrice + Point*100;

P2Buffer = xPrice ;

P3Buffer = xPrice - Point*100;

} // for

return(0);

} // start
 

Ne ho bisogno per un EA però!

 

I codificatori aiutano per favore

Cosa cambiare nel codice per spostare più punti su e giù dalle candele?

File:
diagram.gif  18 kb
 

Qualcuno potrebbe davvero aiutarti se postassi il codice.

Lux

 

Ecco l'indicatore

Indicatore è possibile modificare il codice per spostare su e giù i punti

File:
 

uso corretto di Time[]

Sono un discreto programmatore ma nuovo di mql4. Sto lavorando su un consulente esperto di box trade (aka breakout trade). Essenzialmente dovrebbe trovare i valori più alti e più bassi per uno specifico time frame, e quando una candela chiude al di fuori di quel box piazzo un trade.

Essenzialmente ci sono tre stati in cui posso far partire il mio EA

1) dopo la chiusura del giorno precedente, e prima dell'ora di inizio del box.

2) dopo l'inizio del box ma prima della fine del box.

3) dopo la fine del box.

Quello che mi confonde è l'array Time[] perché l'indice continua a cambiare. Supponiamo che io entri allo stato 2. Nella funzione init avevo intenzione di impostare una variabile globale che desse la posizione dell'inizio del box. Man mano che le citazioni entrano la mia funzione start viene costantemente chiamata, e una volta raggiunto il tempo di fine della scatola avrei avuto le posizioni di inizio e fine. Ovviamente non è così, perché l'indice dell'array Time continua a scorrere in avanti.

Nel migliore dei casi posso continuare ad incrementare la posizione dell'indice di inizio della casella, ma questo non sembra un modo molto pulito di fare le cose.

Se avete un suggerimento su come dovrei cambiare il mio modo di pensare dal tradizionale c/c++ a mql4 mi piacerebbe sentirlo.

Inoltre, quando ho finito, trarrei ovviamente grande beneficio da una revisione del codice da parte di un programmatore più anziano. Qualcuno vorrebbe offrirsi volontario per questo?

Grazie per il vostro tempo,

Markus

 
mweltin:
Sono un discreto programmatore ma nuovo di mql4. Sto lavorando ad un consulente esperto di box trade (aka breakout trade). Essenzialmente dovrebbe trovare i valori più alti e più bassi per uno specifico time frame, e quando una candela chiude fuori da quel box piazzo un trade.

Essenzialmente ci sono tre stati in cui posso far partire il mio EA

1) dopo la chiusura del giorno precedente e prima dell'ora di inizio del box.

2) dopo l'inizio del box ma prima della fine del box.

3) dopo la fine del box.

Quello che mi confonde è l'array Time[] perché l'indice continua a cambiare. Supponiamo che io entri allo stato 2. Nella funzione init avevo intenzione di impostare una variabile globale che desse la posizione dell'inizio del box. Man mano che le citazioni entrano la mia funzione start viene costantemente chiamata, e una volta raggiunto il tempo di fine della scatola avrei avuto le posizioni di inizio e fine. Ovviamente non è così, perché l'indice dell'array Time continua a scorrere in avanti.

Nel migliore dei casi posso continuare ad incrementare la posizione dell'indice di inizio della casella, ma questo non sembra un modo molto pulito di fare le cose.

Se avete un suggerimento su come dovrei cambiare il mio modo di pensare dal tradizionale c/c++ a mql4 mi piacerebbe sentirlo.

Inoltre, quando ho finito, trarrei ovviamente grande beneficio da una revisione del codice da parte di un programmatore più anziano. Qualcuno vorrebbe offrirsi volontario per questo?

Grazie per il vostro tempo,

Markus

Ciao, la funzione Time[] non continua a cambiare - solo alla fine della barra del grafico corrente cambia. TimeCurrent() invece restituisce un valore che cambia continuamente (anche se con una risoluzione di 1 secondo).

È possibile ottenere il tempo esatto di qualsiasi barra e timeframe usando anche iTime(). Ci sono diversi modi per farlo...

 

aprire due ordini nello stesso tempo (problema...)

Ciao, non so perché in alcune opportunità lo script apre due ordini nello stesso momento.

qualcuno può aiutarmi con questo, per favore

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,EAName, MagicNo, 0,Green);

altrimenti

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,EAName, MagicNo, 0,Verde);

se(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

grazie

 

Aiuto per il codice

Ciao a tutti,

Vorrei codificare un indicatore per calcolare il valore di chiusura che crea un'inversione di un indicatore come l'HMA. Per questo ho bisogno di creare una funzione per calcolare un valore di HMA con una scheda di valori di chiusura dove modifico il valore corrente in un ciclo dicotomico per trovare il valore che crea l'inversione.

Qualcuno può aiutarmi con la mia funzione ComputeHull?

Qui il mio codice, senza ricerca dicotomica è solo un semplice indicatore HMA con funzione ComputeHull, l'indicatore viene visualizzato ma è spostato verso il basso

Saluti

//#proprietà indicator_separate_window

#proprietà indicator_chart_window

#proprietà indicator_buffers 3

#proprietà indicator_color1 Blue

//---- parametri di input

extern int HullAntPeriod=12;

//---- buffer

double TempBuf1[]

double TempBuf2[]

double HullAntBuf[]

//Variabile

int HalfHullAntPeriod;

int SqrtHullAntPeriod;

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

//| Funzioni specifiche |

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

double ComputeHull(int ActualBar)

{

double CloseTemp[]

double Temp[];

doppio Temp1, Temp2;

doppio risultato = -1;

int i;

//Copia i valori di chiusura in CloseTemp

ArrayResize(CloseTemp, HullAntPeriod+SqrtHullAntPeriod);

ArrayCopy(CloseTemp, Close, 0, ActualBar, HullAntPeriod+SqrtHullAntPeriod);

ArraySetAsSeries(CloseTemp, true);

ArrayResize(Temp, SqrtHullAntPeriod);

//calcolo del valore HMA

for(i=0; i<SqrtHullAntPeriod; i++)

{

Temp1 = iMAOnArray(CloseTemp, 0, HalfHullAntPeriod, 0, MODE_LWMA, i);

Temp2 = iMAOnArray(CloseTemp, 0, HullAntPeriod, 0, MODE_LWMA, i);

Temp = 2*Temp1-Temp2;

}

ArraySetAsSeries(Temp, true);

risultato = iMAOnArray(Temp, 0, SqrtHullAntPeriod, 0, MODE_LWMA, 0);

//---- fatto

return(risultato);

}

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

//|Funzione di inizializzazione dell'indicatore personalizzato |

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

int init()

{

//---- 1 buffer aggiuntivi sono utilizzati per i dati temporanei.

IndicatorBuffers(3);

//---- impostazioni di disegno

SetIndexStyle(0,DRAW_LINE);

SetIndexStyle(1,DRAW_NONE);

//---- mappatura di 2 buffer di indicatori

SetIndexBuffer(0,HullAntBuf);

SetIndexBuffer(1,TempBuf1);

SetIndexBuffer(2,TempBuf2);

//---- nome per DataWindow e l'etichetta della sottofinestra dell'indicatore

IndicatorShortName("HULL ANTICIP("+HullAntPeriod+")");

SetIndexLabel(0, "HULL ANTICIPATION");

SetIndexLabel(1,NULL);

SetIndexLabel(2,NULL);

//---- Inizializzazione dell'indicatore specifico

HalfHullAntPeriod = MathFloor(HullAntPeriod/2);

SqrtHullAntPeriod = MathFloor(MathSqrt(HullAntPeriod));

//---- inizializzazione fatta

return(0);

}

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

//| Funzione di deinizializzazione dell'indicatore personalizzato |

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

int deinit()

{

//----

//----

return(0);

}

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

//| Funzione di iterazione dell'indicatore personalizzato |

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

int start()

{

int barra, limite, i;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limite=Bars-counted_bars;

for(i=0; i<limite; i++)

HullAntBuf=ComputeHull(i);

//----

return(0);

}

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

 

Perché non funziona?

int Highest;

double Place;

int Start()

{

Highest=iHighest(Symbol(),0,MODE_HIGH,1,0);Place=iHigh(Symbol(),0,Highest);

if(Gate==0){

if(iClose(Symbol(),0,0)>=Place){

OrderModify(ticket3,Ask,Ask-TrailingStop*Point-Spread,0,0,Green);

Gate=1;}

return(0);

}

Ricevo degli errori. Non riesco a fare un semplice trailing stop!!!!!!!