Comment coder ? - page 324

 
mladen:
Pas si facile à expliquer

Vous devez envoyer un événement au graphique hors ligne qui lui "dira" (à partir de votre indicateur) qu'un nouveau tick est généré et qu'il doit exécuter les routines requises. Cela signifie utiliser des fonctions de bas niveau. Le tout peut ressembler à quelque chose comme ceci :

#include

#import "user32.dll"

int GetParent(int hWnd);

#import

#define CHART_CMD_UPDATE_DATA 33324

void UpdateChartWindows()

{

int filePeriod = 1; // file period

string fileSymbol = "your offline symbol name";

string chartName = "your offline symbol chart full name";

string stringForName = " ";

//

//

//

//

//

int windowHandle = WindowHandle(fileSymbol,filePeriod);

if (windowHandle != 0)

{

windowHandle = GetParent(windowHandle);

windowHandle = GetWindow(windowHandle,GW_HWNDFIRST);

while (windowHandle != 0)

{

int len = GetWindowTextA(windowHandle,stringForName,80);

if (len > 0 && StringSubstr(stringForName,0,len) == chartName)

PostMessageA(windowHandle,WM_COMMAND,CHART_CMD_UPDATE_DATA,0);

windowHandle = GetWindow(windowHandle,GW_HWNDNEXT);

}

}

}

Merci, je vais vérifier. Cependant, je trouve le problème pour envoyer correctement les ordres. Mon indicateur crée un nom pour le graphique hors ligne non standard et les plateformes ne l'ouvrent pas pour cette raison.

Merci pour votre disponibilité

 

Ok, le problème de la carte hors ligne est en cours.

J'ai un autre problème.

Je dois créer un indicateur qui calcule les volumes avec des règles spécifiques.

Ce dont j'ai besoin, c'est que chaque fois qu'il y a une variation de tick, l'indicateur doit compter la longueur du swing.

Exemple.

sur une bougie ouverte la valeur tampon est 0. Donc il doit compter tous les tick fait avant un retracement mais la valeur finale retournée est la plus haute depuis la fermeture de la bougie.

Ensuite, il doit mettre la couleur de l'histogramme rélettré le mouvement effectué de la plus haute plage retournée du buffer.

J'ai essayé de différentes manières mais sans succès.

Aidez-moi ^^.

Je vous remercie

 

Merci pour tout votre soutien. J'apprends de plus en plus et avec votre aide, je répare toutes mes demandes...MAIS.

J'en ai une autre^^.

J'ai besoin de créer une fonction void pour rappeler et il doit être la fusion de ces deux codes.

Le premier trouve la dernière commande ouverte et le second trouve le nombre de commandes ouvertes dont le prix d'ouverture est plus élevé.

J'ai besoin de faire une fonction pour avoir directement le numéro de l'ordre qui a le prix d'ouverture le plus élevé.

Merci pour votre aide.

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

OrderSelect(i, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {

if(TYPE == OP_BUY) {

double OPrice = OrderOpenPrice();[/PHP]

[PHP]for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>test(OP_BUY) Hbuys++;

}

}

}

return(Hbuys);

}

 
dasio:
Merci pour tout votre soutien. J'apprends de plus en plus et avec votre aide, j'ai résolu toutes mes demandes...MAIS.

J'en ai une autre^^.

J'ai besoin de créer une fonction void à rappeler et elle doit être la fusion de ces deux codes.

Le premier trouve la dernière commande ouverte et le second le nombre de commandes ouvertes dont le prix d'ouverture est le plus élevé.

J'ai besoin de faire une fonction pour avoir directement le numéro de l'ordre qui a le prix d'ouverture le plus élevé.

Merci pour votre aide.

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

OrderSelect(i, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {

if(TYPE == OP_BUY) {

double OPrice = OrderOpenPrice();[/PHP]

for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>test(OP_BUY) Hbuys++;

}

}

}

return(Hbuys);

}

J'ai fait une erreur sur le deuxième code. C'est bien

[PHP]for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break ;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>OPrice Hbuys++ ;

}

}

}

return(Hbuys) ;

}

 

dasio

Une fonction void est une fonction qui ne renvoie aucune valeur. Si c'est le cas, la seule façon raisonnable de le faire est d'utiliser une variable qui sera transmise par référence à la fonction (d'après mon expérience, l'utilisation de variables de portée globale à cette fin est une très mauvaise pratique - elle évite les règles de codage structurées et, dans les cas où une erreur doit être recherchée, c'est un cauchemar lorsque de telles variables sont utilisées). C'est ce que vous aviez à l'esprit ?

dasio:
J'ai fait une erreur sur le deuxième code. C'est juste
for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>OPrice Hbuys++;

}

}

}

return(Hbuys);

}

 
mladen:
dasio La fonction void est une fonction qui ne renvoie aucune valeur. Si c'est le cas, la seule façon raisonnable de le faire est d'utiliser une variable qui sera transmise par référence à la fonction (d'après mon expérience, l'utilisation de variables de portée globale à cette fin est une très mauvaise pratique - elle évite les règles de codage structurées et, dans les cas où une erreur doit être recherchée, c'est un cauchemar lorsque de telles variables sont utilisées). C'est ce que vous aviez en tête ?

Merci pour votre réponse,

Je n'ai besoin que du nombre d'achats qui ont l'ordre d'ouverture le plus élevé et l'ordre d'ouverture le plus bas par rapport au dernier ordre d'achat ouvert.

Je dois utiliser le résultat comment moltiplier dans une fonction vois pour une certaine vérification.

Il est donc beaucoup plus simple de rappeler cet enregistrement sur demande. Peut-être de cette façon, je peux le rappeler simplement CalculateCurrentBuy(Symbol())

int CalculateHighestbuy(string symbol) {

int Hopen=0;

for(int i=0;i<OrdersTotal();i++) {

code here

}

}

return(Hopen);

}

 

grille de suivi ?

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){

OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){

OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

}[/CODE]

I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.

[CODE] void TrailingOrders() {

if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {

if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);

}

}

if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {

if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);

}

}

}

Ce code suivra 2 ordres mais comment puis-je le modifier pour en suivre plus ? Dès que j'essaie de configurer le code de suivi pour plusieurs niveaux, comme le code de la grille ci-dessus, il se transforme en crème pâtissière.

Tout commentaire serait apprécié.

Salutations CJA

 

...

cja

J'ai essayé avec le code suivant et cela fonctionne bien (voir l'image d'exemple : différentes étapes déjà appliquées)

Je ne savais pas à quoi servaient les variables s.ticketP et b.ticketP, je les ai donc utilisées de la façon dont vous pouvez le voir dans le code.

extern double Trail.SELLSTOP.Orders.Distance = 15;

extern double Trail.BUYSTOP.Orders.Distance = 20;

extern int Stop.Order.Levels = 4;

extern double Sell.Lots = 0.1;

extern double Sell.Multiplier = 0.1;

extern double Buy.Lots = 0.1;

extern double Buy.Multiplier = 0.2;

extern bool Set.SELLSTOP = true;

extern bool Set.BUYSTOP = true;

int init()

{

return(0);

}

int start()

{

double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;

static int s.ticketP=0;

static int b.ticketP=0;

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}

}

s.ticketP=Stop.Order.Levels;

b.ticketP=Stop.Order.Levels;

return(0);

}

cja:
for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){

OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){

OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

}[/CODE]

I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.

[CODE] void TrailingOrders() {

if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {

if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);

}

}

if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {

if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);

}

}

}

Ce code va suivre 2 commandes mais comment puis-je le modifier pour en suivre plus ? Dès que j'essaie de configurer le code de suivi pour plusieurs niveaux, comme le code de la grille ci-dessus, il se transforme en crème pâtissière.

Tout commentaire serait apprécié.

Salutations CJA
Dossiers :
stopd.gif  36 kb
 

Grille de queue

mladen:
cja

Je l'ai essayé avec le code suivant et cela fonctionne bien (voir l'image d'exemple : différentes étapes déjà appliquées)

Je ne savais pas à quoi servaient les variables s.ticketP et b.ticketP et je les ai donc utilisées de la façon dont vous pouvez le voir dans le code.

extern double Trail.SELLSTOP.Orders.Distance = 15;

extern double Trail.BUYSTOP.Orders.Distance = 20;

extern int Stop.Order.Levels = 4;

extern double Sell.Lots = 0.1;

extern double Sell.Multiplier = 0.1;

extern double Buy.Lots = 0.1;

extern double Buy.Multiplier = 0.2;

extern bool Set.SELLSTOP = true;

extern bool Set.BUYSTOP = true;

int init()

{

return(0);

}

int start()

{

double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;

static int s.ticketP=0;

static int b.ticketP=0;

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}

}

s.ticketP=Stop.Order.Levels;

b.ticketP=Stop.Order.Levels;

return(0);

}

Bonjour mladen,

Merci pour votre aide, mais je n'ai peut-être pas été très clair dans mon message ci-dessus. Je n'ai pas de problème pour mettre en place une grille, le problème que j'ai est de suivre la grille sans perdre la séparation des ordres.

s.ticketP et b.ticketP font simplement référence aux codes d'ordres en attente BUYSTOP et SELLSTOP utilisés ailleurs dans l'EA.

Salutations CJA

 

Grille de suivi

cja:
Bonjour mladen,

Merci pour votre aide, mais je n'ai peut-être pas été très clair dans mon message ci-dessus. Je n'ai aucun problème à mettre en place une grille, le problème que j'ai est de suivre la grille sans perdre la séparation des ordres.

s.ticketP & b.ticketP se réfèrent simplement au code des ordres en attente BUYSTOP & SELLSTOP utilisés ailleurs dans l'EA.

Salutations CJA

Bonjour mladen,

Vous avez le temps d'y jeter un coup d'oeil ?

Amicalement vôtre CJA

Raison: