Domande e risposte ai programmatori su MQL 4 - pagina 4

 

Finora, proprio così:

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

//| Fibo trading.mq4 |

//| Minodi |

//| minodi@yandex.ru |

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

#proprietà copyright "Minodi"

#proprietà link "minodi@yandex.ru"


extern int period_EMA = 233,

periodo_SMA = 233,

stoploss = 30,

extern double Lot = 0,01;

extern string SesEnd ="22:00"; //tempo limite per Hai o Low

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

//| funzione di avvio del programma script |

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

int start()

{

//------- Prezzi giornalieri, Fibs e Hi-Low rendering time--------------+

int shift = iBarShift(NULL,1440,Time[0]) + 1;

double HiPrice = iHigh(NULL,1440,shift); //prezzo alto

double LoPrice = iLow(NULL,1440,shift); // prezzo basso

double OpPrice = iOpen (NULL,1440,shift); //open price

double ClPrice = iClose (NULL,1440,shift); // Prezzo di chiusura

datetime StTime = iTime(NULL,1440,shift); // ?

se(TimeDayOfWeek(StTime)==0/*Domenica*/)

{//Aggiungi il massimo e il minimo del venerdì

HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));

LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));

OpPrice = iOpen(NULL,1440,shift+1);

ClPrice = iClose (NULL,1440,shift+1);

}

doppio Pivot =(HiPrice+LoPrice+ClPrice)/3;

double Range =HiPrice-LoPrice;

doppio Fibo138 =1,382*Range+LoPrice;

doppio Fibo162 =1,618*Range+LoPrice;

doppio Fibo_138 =LoPrice-(1,382*Range-Range);

doppio Fibo_162 =LoPrice-(1,618*Range-Range);

//---------------- HiTime e Low-----------------------------------------+

int HiTime,LoTime;

int time; // sulla prossima barra rotola i valori


if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}

se (High[0]>HiPrice)HiTime=TimeCurrent();

se (Low[0]<LoPrice)LoTime=TimeCurrent();


Comment("Su questa barra: "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime);

//-----------------Ценовой диапазон Демарка-------------------------------+

int currDay, i=0; //

se (currDay!=TimeDay(Time[i]))

{

se (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;

se (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;

se (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;

i++;

}

double MaxDay = x - LoPrice; // demarca la gamma dei prezzi

double MinDay = x - HiPrice; // demarca la gamma dei prezzi

// -----------Скользящие средние---------------------------------------------+

double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);

double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);

double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

//----------------Удаление вчерашних ордеров---------------------------------+

//------------------Ордера----------------------------------------------------+

 

Cari membri del forum, controllate il codice, ho intenzione di aggiungere gradualmente

 

Questi sono i parametri che ti ho dato, mettili prima di iniziare


int HiTime,LoTime;

int time; // на следующем баре обнкляем значения

 
Ciao, cari programmatori! Potete consigliare a un principiante come scrivere, se possibile, uno script (non un Expert Advisor) che piazzi un ordine di trading e allo stesso tempo abiliti la funzione Trailing Stop per esso a un livello minimo? Forse ce n'è uno già pronto, allora se puoi dammi un link.
 
Vladon >>:

Вот эти параметры ято я давал, поместите перд стартом


int HiTime,LoTime;

int time; // на следующем баре обнкляем значения


Spostato. Tutto il resto è a posto?
 

Cari membri del forum, per favore prestate attenzione e diteci quali errori sono stati fatti:

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

//| Fibo trading.mq4 |

//| Minodi |

//| minodi@yandex.ru |

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

#proprietà copyright "Minodi"

#proprietà link "minodi@yandex.ru"


extern int period_EMA = 233,

periodo_SMA = 233,

stoploss = 30,

Magia = 55;

extern double Lot = 0,01;

extern string SesEnd ="22:00"; //tempo limite per Hai o Low


int HiTime,LoTime;

int time; // sulla prossima barra arrotola i valori


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

//| funzione di avvio del programma script |

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

int start()

{

//------- Prezzi giornalieri, Fibs e rendering High-Low time--------------+

int shift = iBarShift(NULL,1440,Time[0]) + 1;

double HiPrice = iHigh(NULL,1440,shift); //prezzo alto

double LoPrice = iLow(NULL,1440,shift); // prezzo basso

double OpPrice = iOpen (NULL,1440,shift); //open price

double ClPrice = iClose (NULL,1440,shift); // Prezzo di chiusura

datetime StTime = iTime(NULL,1440,shift); // ?

se(TimeDayOfWeek(StTime)==0/*Domenica*/)

{//Aggiungi il massimo e il minimo del venerdì

HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));

LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));

OpPrice = iOpen(NULL,1440,shift+1);

ClPrice = iClose (NULL,1440,shift+1);

}

doppio Pivot =(HiPrice+LoPrice+ClPrice)/3;

double Range =HiPrice-LoPrice;

doppio Fibo138 =1,382*Range;

doppio Fibo162 =1.618*Range;

double Fibo_138 =(LoPrice-1.382*Range)-Range;

double Fibo_162 =(LoPrice-1.618*Range)-Range;

//---------------- tempo hai e basso-----------------------------------------+


if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}

se (High[0]>HiPrice)HiTime=TimeCurrent();

se (Low[0]<LoPrice)LoTime=TimeCurrent();


Comment("Su questa barra: "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime);

//-----------------Ценовой диапазон Демарка-------------------------------+

int currDay, i=0; //

se (currDay!=TimeDay(Time[i]))

{

se (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;

se (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;

se (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;

i++;

}

double MaxDay = x - LoPrice; // demarca la gamma dei prezzi

double MinDay = x - HiPrice; // Demark range di prezzo

// -----------Скользящие средние---------------------------------------------+

double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0);

double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);

double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

//------------------Ордера----------------------------------------------------+

se (HiTime>LoTime){

int ticket1 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,0,Pivot,NULL,Magic,58000,Red);

int ticket2 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket3 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket4 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket5 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket6 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,Pivot,NULL,Magic,58000,Red);

}

se (HiTime<LoTime){

int ticket7=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,0,Pivot,NULL,Magic,58000,Red);

int ticket8=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket9=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket10=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,Pivot,NULL,Magic,58000,Red);

int ticket11=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket12=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,Pivot,NULL,Magic,58000,Red);

}

se (HiTime>LoTime && ClPrice>Pivot) {

int ticket13=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket14=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,Fibo138,NULL,Magic,58000,Red);

}

se (HiTime<LoTime && ClPrice<Pivot)

int ticket15=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket16=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,Fibo_138,NULL,Magic,58000,Red);

}

ritorno(0);


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


 

a prima vista i parametri:

int currDay;


per iniziare

 
Ho dimenticato i fermi, li ho messi a 30p
 
Indica gli errori, voglio che il codice funzioni
 

Signori del forum, aiuto per capire....

Ecco una parte del codice (il codice principale è preso dal manuale di costruzione di Expert Advisor)

// Funzione d'ordine
// Variabili globali:
// Mas_Ord_New[31][9] // Array degli ultimi ordini conosciuti
// Mas_Ord_Old[31][9] // Array degli ordini precedenti (vecchi)
// 1° indice = numero d'ordine
// [][0] non è definito
// [][1] prezzo dell'ordine aperto (abs. di un ordine (tasso abc)
// [][2] StopLoss di un ordine (tasso abc)
// [][3] TakeProfit di un ordine (tasso abc)
// [][4] Numero di ordine
// [][5] numero di lotti di un ordine. (Abc Rate)
// [][6] Tipo di ordine 0=B,1=S,2=BL,3=SL,4=BS,5=SS
// [][7] numero magico dell'ordine
// [][8] 0/1

se (Mas_Ord_Old[vecchio][6]==0 && Bid>Mas_Ord_Old[vecchio][2] && Bid<Mas_Ord_Old[vecchio][3])
Inform(1, Mas_Ord_Old[old][4]); // Quindi l'ordine Buy è stato chiuso dal segnale del contatore
else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa che SL è scattato
else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]) // TA attivato

else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3])
Inform(2, Mas_Ord_Old[old][4]); // Così l'ordine Sell è chiuso dal segnale del contatore
else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]) // significa che SL è scattato
else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TA ha scattato

Il resto non è di alcun interesse...

Il problema: nel 90% dei casi viene mostrato il parametro corretto, cioè se SL è attivato, il parametro è "19", se TP è "20", se l'ordine viene chiuso manualmente, o da un segnale di contatore, il parametro è "1" o "2". È stato progettato così.

Ma a volte (abbastanza spesso) invece di "20" restituisce "19" (o viceversa), o anche "1"("2"). Per favore, aiutatemi a descrivere correttamente la funzione "if": come condizioni di motivi di chiusura dell'ordine.

Penso che la ragione possa essere l'arrotondamento dei prezzi?