Questions et réponses aux programmeurs sur MQL 4 - page 4

 

Jusqu'à présent, c'est comme ça :

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

//| Fibo trading.mq4 |

//| Minodi |

//| minodi@yandex.ru |

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

#property copyright "Minodi"

#lien de propriété "minodi@yandex.ru"


extern int period_EMA = 233,

période_SMA = 233,

stoploss = 30,

extern double Lot = 0.01 ;

extern string SesEnd = "22:00" ; //heure limite pour Hai ou Low

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

//| fonction de démarrage du programme de script |

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

int start()

{

//------- Prix quotidiens, Fibs et rendu High-Low time--------------+

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

double HiPrice = iHigh(NULL,1440,shift) ; /Prix élevé

double LoPrice = iLow(NULL,1440,shift) ; // prix bas

double OpPrice = iOpen (NULL,1440,shift) ; //prix d'ouverture

double ClPrice = iClose (NULL,1440,shift) ; // Prix de clôture

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

si(TimeDayOfWeek(StTime)==0/*Sunday*/)

{//Ajouter le haut et le bas du vendredi

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

}

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

double Range =HiPrice-LoPrice ;

double Fibo138 =1.382*Range+LoPrice ;

double Fibo162 =1.618*Range+LoPrice ;

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

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

//---------------- HiTime et Low-----------------------------------------+

int HiTime,LoTime ;

int time ; // à la barre suivante, lancez les valeurs.


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

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

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


Comment("Sur cette barre : "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime) ;

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

int currDay, i=0 ; //

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

{

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

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

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

i++ ;

}

double MaxDay = x - LoPrice ; // Plage de prix de Demark

double MinDay = x - HiPrice ; // Plage de prix de Demark

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

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

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

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

 

Chers membres du forum, vérifiez le code, je prévois d'ajouter progressivement des

 

Ce sont les paramètres que je vous ai donnés, placez-les avant de commencer.


int HiTime,LoTime;

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

 
Bonjour, chers programmateurs! Pouvez-vous conseiller un débutant sur la façon d'écrire, si possible, un script (pas un conseiller expert) qui placerait un ordre de transaction et activerait en même temps la fonction Trailing Stop pour celui-ci à un niveau minimum ? Il en existe peut-être une toute prête, alors si vous pouvez me donner un lien.
 
Vladon >>:

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


int HiTime,LoTime;

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


Proposé. Tout le reste est OK ?
 

Chers membres du forum, veuillez être attentifs et nous dire quelles erreurs ont été commises :

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

//| Fibo trading.mq4 |

//| Minodi |

//| minodi@yandex.ru |

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

#property copyright "Minodi"

#lien de propriété "minodi@yandex.ru"


extern int period_EMA = 233,

période_SMA = 233,

stoploss = 30,

Magie = 55 ;

extern double Lot = 0.01 ;

extern string SesEnd = "22:00" ; //heure limite pour Hai ou Low


int HiTime,LoTime ;

int time ; // à la barre suivante, les valeurs sont remontées.


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

//| fonction de démarrage du programme de script |

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

int start()

{

//------- Prix quotidiens, Fibs et rendu High-Low time--------------+

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

double HiPrice = iHigh(NULL,1440,shift) ; /Prix élevé

double LoPrice = iLow(NULL,1440,shift) ; // prix bas

double OpPrice = iOpen (NULL,1440,shift) ; //prix d'ouverture

double ClPrice = iClose (NULL,1440,shift) ; // Prix de clôture

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

si(TimeDayOfWeek(StTime)==0/*Sunday*/)

{//Ajouter le haut et le bas du vendredi

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

}

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

double Range =HiPrice-LoPrice ;

double Fibo138 =1.382*Range ;

double Fibo162 =1.618*Range ;

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

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

//---------------- temps hai et bas-----------------------------------------+


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

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

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


Comment("Sur cette barre : "+"\n Time High Point="+HiTime+"\n Time Low Point="+LoTime) ;

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

int currDay, i=0 ; //

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

{

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

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

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

i++ ;

}

double MaxDay = x - LoPrice ; // Plage de prix de Demark

double MinDay = x - HiPrice ; // Plage de prix de Demark

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

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

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

si (HiTime>LoTime){

int ticket1 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,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) ;

}

si (HiTime<LoTime){

int ticket7=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,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) ;

}

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

}

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

}

retour(0) ;


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


 

à première vue les paramètres :

int currDay ;


pour le départ

 
J'ai oublié les arrêts, je les ai mis à 30p.
 
Signalez les erreurs, je veux que le code fonctionne.
 

Messieurs du forum, aidez à comprendre....

Voici une partie du code (le code principal est tiré du manuel de construction de l'Expert Advisor)

// Fonction d'ordre
// Variables globales :
// Mas_Ord_New[31][9] // Tableau des derniers ordres connus
// Mas_Ord_Old[31][9] // Tableau des ordres précédents (anciens)
// 1er indice = numéro d'ordre
// [][0] n'est pas défini
// [][1] prix de l'ordre ouvert (abs. d'un ordre (taux abc)
// [][2] StopLoss d'un ordre (taux abc)
// [][3] TakeProfit d'un ordre (taux abc)
// [][4] Numéro de l'ordre
// [][5] nombre de lots d'un ordre. (Taux Abc)
// [][6] Type de commande 0=B,1=S,2=BL,3=SL,4=BS,5=SS
// [][7] numéro magique de l'ordre
// [][8] 0/1

if (Mas_Ord_Old[old][6]==0 && Bid>Mas_Ord_Old[old][2] && Bid<Mas_Ord_Old[old][3])
Inform(1, Mas_Ord_Old[old][4]) ; // L'ordre d'achat a donc été fermé par le signal du compteur
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]) // cela signifie que SL a déclenché
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 déclenché

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]) ; // L'ordre de vente est donc fermé par le signal du compteur
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]) // cela signifie que SL a déclenché
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 a déclenché

Le reste est sans intérêt...

Le problème : dans 90% des cas, le paramètre correct est affiché, c'est-à-dire que si SL est déclenché, le paramètre est "19", si TP est "20", si l'ordre est fermé manuellement, ou par un signal de compteur, le paramètre est "1" ou "2". Il a été conçu de cette façon.

Mais parfois (assez souvent), au lieu de "20", il renvoie "19" (ou vice versa), ou même "1"("2"). S'il vous plaît, aidez-moi à décrire correctement la fonction "si" : comme conditions des raisons de fermeture de l'ordre.

Je pense que la raison peut être dans l'arrondi des prix ?