Aide au codage - page 238

 

Est-il possible d'ajouter des options de choix ?

Par exemple,

Séparément, achat, et vente séparément

Modification : BE tous acheter 0, ou +1, ou +2 pips ou vendre tous BE 0, 1 ou 2 pips ?

Est-ce possible ?

be.mq4

Dossiers :
be.mq4  1 kb
 

Bonjour Mladen ,

J'essaie de coder ma stratégie pour faciliter le trading, j'ai été capable de sélectionner le dernier ordre avec succès en utilisant ce code.

void OpenNewTrade()

{ datetime lastTime = 0 ;

int lastTicket = -1 ; // Aucun ordre ouvert.

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime() ;

lastTicket = OrderTicket() ;

si (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grille*PipValue*Point

{

{

BuyOrder() ;

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder() ;

}

}

}

return(lastTicket) ;

}

sinon

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

Pouvez-vous jeter un coup d'oeil à ce code ? J'essaie de supprimer la commande la plus ancienne en utilisant la date et le ticket de commande, par exemple si la commande ouverte >2, supprimer la commande la plus ancienne.

//-------------------------------------------------------------

// Etasoft Inc. Forex EA et générateur de script version 4.1 EA

//-------------------------------------------------------------

// Mots clés : MT4, Forex EA builder, créer EA, conseiller expert développeur

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"

#property link

#include

#include

// variables exportées

extern int OrderId = 1 ;

extern int Slippage = 2 ;

extern double Lots = 0.01 ;

extern int MaxOrdersAllowed = 2;// op buy et op sell autorisés

extern int Grid = 10 ; // distance totale en pips des ordres ouverts

extern string EAComment = "564 testing" ;

// variables locales

double PipValue=1 ; // cette variable est là pour supporter les brokers à 5 chiffres

bool Terminated = false ;

string LF = "\n" ; // utilisez ceci dans les blocs personnalisés ou utilitaires où vous avez besoin d'un saut de ligne.

int NDigits = 4 ; // utilisé principalement pour NormalizeDouble dans les blocs de type Flex

int ObjCount = 0 ; // compte de tous les objets créés sur le graphique, permet la création d'objets avec des noms uniques

int current = 0 ;

int init()

{

NDigits = Digits ;

if (false) ObjectsDeleteAll() ; // efface le graphique

Comment("") ; // efface le graphique

}

// Démarrage de l'expert

int start()

{

if (Bars < 10)

{

Comment("Pas assez de barres") ;

retour (0) ;

}

if (Terminé == true)

{

Comment("EA Terminated.") ;

retour (0) ;

}

OnEveryTick1() ;

}

void OnEveryTick1()

{

if (true == false && false) PipValue = 10 ;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10 ;

IfOrderDoesNotExist2() ;

IfOrderDoesNotExist4() ;

MaximumOrder() ;

}

void IfOrderDoesNotExist2()

{

bool exists = false ;

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true ;

}

}

sinon

{

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

if (exists == false)

{

BuyPendingOrder() ;

}

}

void IfOrderDoesNotExist4()

{

bool exists = false ;

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true ;

}

}

sinon

{

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

if (exists == false)

{

SellPendingOrder() ;

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0 ;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point ;

double SL = prix - 0*PipValue*Point ;

si (0 == 0) SL = 0 ;

double TP = prix + 0*PipValue*Point ;

si (0 == 0) TP = 0 ;

si (0 == 0) expire = 0 ;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue) ;

si (ticket == -1)

{

Print("Erreur OrderSend() - ", ErrorDescription(GetLastError())) ;

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0 ;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point ;

double SL = prix + 0*PipValue*Point ;

si (0 == 0) SL = 0 ;

double TP = prix - 0*PipValue*Point ;

si (0 == 0) TP = 0 ;

si (0 == 0) expire = 0 ;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red) ;

si (ticket == -1)

{

Print("Erreur OrderSend() - ", ErrorDescription(GetLastError())) ;

}

}

void MaximumOrder()

{

si (MaxOrdersAllowed> 0)

{

OrderCount() ;

}

}

void OrderCount()

{

int count = 0 ;

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

compte++ ;

}

}

sinon

{

Print("Erreur OrderSend() - ", ErrorDescription(GetLastError())) ;

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder() ;

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0 ;

int lastTicket = -1 ; // Aucun ouvert.

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime() ;

lastTicket = OrderTicket() ;

si (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red) ;

}

}

}

return(lastTicket) ;

}

sinon

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

int deinit()

{

if (false) ObjectsDeleteAll() ;

}

 
sulaimoney:
Bonjour Mladen ,

J'essaie de coder ma stratégie pour faciliter le trading, j'ai été capable de sélectionner le dernier ordre avec succès en utilisant ce code.

void OpenNewTrade()

{ datetime lastTime = 0 ;

int lastTicket = -1 ; // Aucun ordre ouvert.

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime() ;

lastTicket = OrderTicket() ;

si (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grille*PipValue*Point

{

{

BuyOrder() ;

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder() ;

}

}

}

return(lastTicket) ;

}

sinon

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

Pouvez-vous jeter un coup d'oeil à ce code ? J'essaie de supprimer la commande la plus ancienne en utilisant la date et le ticket de commande, par exemple si la commande ouverte >2, supprimer la commande la plus ancienne.

//-------------------------------------------------------------

// Etasoft Inc. Forex EA et générateur de script version 4.1 EA

//-------------------------------------------------------------

// Mots clés : MT4, Forex EA builder, créer EA, conseiller expert développeur

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"

#property link

#include

#include

// variables exportées

extern int OrderId = 1 ;

extern int Slippage = 2 ;

extern double Lots = 0.01 ;

extern int MaxOrdersAllowed = 2;// op buy et op sell autorisés

extern int Grid = 10 ; // distance totale en pips des ordres ouverts

extern string EAComment = "564 testing" ;

// variables locales

double PipValue=1 ; // cette variable est là pour supporter les brokers à 5 chiffres

bool Terminated = false ;

string LF = "\n" ; // utilisez ceci dans les blocs personnalisés ou utilitaires où vous avez besoin d'un saut de ligne.

int NDigits = 4 ; // utilisé principalement pour NormalizeDouble dans les blocs de type Flex

int ObjCount = 0 ; // compte de tous les objets créés sur le graphique, permet la création d'objets avec des noms uniques

int current = 0 ;

int init()

{

NDigits = Digits ;

if (false) ObjectsDeleteAll() ; // efface le graphique

Comment("") ; // efface le graphique

}

// Démarrage de l'expert

int start()

{

if (Bars < 10)

{

Comment("Pas assez de barres") ;

retour (0) ;

}

if (Terminé == true)

{

Comment("EA Terminated.") ;

retour (0) ;

}

OnEveryTick1() ;

}

void OnEveryTick1()

{

if (true == false && false) PipValue = 10 ;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10 ;

IfOrderDoesNotExist2() ;

IfOrderDoesNotExist4() ;

MaximumOrder() ;

}

void IfOrderDoesNotExist2()

{

bool exists = false ;

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true ;

}

}

sinon

{

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

if (exists == false)

{

BuyPendingOrder() ;

}

}

void IfOrderDoesNotExist4()

{

bool exists = false ;

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true ;

}

}

sinon

{

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

if (exists == false)

{

SellPendingOrder() ;

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0 ;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point ;

double SL = prix - 0*PipValue*Point ;

si (0 == 0) SL = 0 ;

double TP = prix + 0*PipValue*Point ;

si (0 == 0) TP = 0 ;

si (0 == 0) expire = 0 ;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue) ;

si (ticket == -1)

{

Print("Erreur OrderSend() - ", ErrorDescription(GetLastError())) ;

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0 ;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point ;

double SL = prix + 0*PipValue*Point ;

si (0 == 0) SL = 0 ;

double TP = prix - 0*PipValue*Point ;

si (0 == 0) TP = 0 ;

si (0 == 0) expire = 0 ;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red) ;

si (ticket == -1)

{

Print("Erreur OrderSend() - ", ErrorDescription(GetLastError())) ;

}

}

void MaximumOrder()

{

si (MaxOrdersAllowed> 0)

{

OrderCount() ;

}

}

void OrderCount()

{

int count = 0 ;

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

si (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

compte++ ;

}

}

sinon

{

Print("Erreur OrderSend() - ", ErrorDescription(GetLastError())) ;

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder() ;

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0 ;

int lastTicket = -1 ; // Aucun ouvert.

for (int i=OrdersTotal()-1 ; i >= 0 ; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime() ;

lastTicket = OrderTicket() ;

si (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red) ;

}

}

}

return(lastTicket) ;

}

sinon

Print("Erreur OrderSelect() - ", ErrorDescription(GetLastError())) ;

}

int deinit()

{

if (false) ObjectsDeleteAll() ;

}

Essayez d'utiliser une fonction comme celle-ci :

void DeleteOldestOrder()

{

datetime lastTime = Time[0]+Period()*60;

int lastTicket = -1; // None open.

for (int i=OrdersTotal()-1; i >= 0; i--)

{

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() <= lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

}

if (lastTicket>-1)

if (OrderSelect(lastTicket,SELECT_BY_TICKET,MODE_TRADES))

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}
 

Merci Mladen

Cela a parfaitement fonctionné. Je m'excuse d'avoir posté un si long morceau de code sur le forum. Je suis encore en train de m'habituer à l'interface. Merci.

 

L'indicateur ne se rafraîchit pas automatiquement.

J'ai ici un indicateur qui est très bien adapté à mon trading.

Malheureusement, il ne se met pas à jour tout seul. Je dois toujours rafraîchir manuellement qu'il est renouvelé.

Existe-t-il un moyen de résoudre ce problème ?

Ce serait très utile !

Merci d'avance.

P.S. : Ci-joint tout ce que j'ai.

Dossiers :
 

Il veut le sms de notification. Comment se présente le code ?

 
popej30:
Il veut le sms de notification. Comment se présente le code ?

popej30

Faites comme ceci :

SendNotification("message de notification que vous voulez envoyer") ;

 

Et où insérez-vous votre numéro de téléphone ? Mon numéro 0039 555-23-45. Où inscrire ?

Exemple :

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}
 
popej30:
Et où insérez-vous votre numéro de téléphone ? Mon numéro 0039 555-23-45. Où insérer ?

Exemple :

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}

Voici une bonne explication de la façon dont vous pouvez le faire :

 
Jim Clark:
L'indicateur ne se rafraîchit pas automatiquement.

J'ai ici un indicateur qui est très bien adapté à mon trading.

Malheureusement, il ne se met pas à jour tout seul. Je dois toujours rafraîchir manuellement qu'il est renouvelé.

Existe-t-il un moyen de résoudre ce problème ?

Ce serait très utile !

Merci d'avance.

P.S. : Ci-joint tout ce que j'ai.

Jim

Au lieu de réécrire toute la chose, ajoutez une limite pour calculer les barres et ensuite toutes ces barres sont recalculées. Cela devrait résoudre le problème de rafraîchissement (il suffit de garder le BarsTocalculate à une valeur raisonnable - pas trop grande ni trop petite. J'ai utilisé 1000 comme valeur par défaut et ça semble aller comme ça). Essayez-le

Dossiers :