Come codificare? - pagina 324

 
mladen:
Non è così facile da spiegare

Dovete inviare un evento al grafico offline che gli "dica" (dal vostro indicatore) che viene generato un nuovo tick e che deve eseguire le routine richieste. Ciò significa utilizzare funzioni di basso livello. Il tutto può assomigliare a questo:

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

}

}

}

Grazie, lo controllerò. Tuttavia trovo il problema per sendorder correttamente. Il mio indicatore crea un nome per il grafico offline non standard e le piattaforme non lo aprono per questo motivo.

Grazie per la tua disponibilità

 

Ok, il problema del grafico offline è al lavoro.

Ho un altro problema.

Devo creare un indicatore che calcoli i volumi con regole specifiche.

Quello che mi serve è che ogni volta che c'è una variazione di tick l'indicatore deve contare la lunghezza dello swing.

Esempio.

su Open candel il valore buffer è 0. Quindi deve contare tutti i tick fatti prima di un ritracciamento ma il valore finale restituito è il più alto di esso dalla chiusura della candela.

Dopo, deve impostare il colore dell'istogramma reletated il movemenet fatto del range più alto restituito dal buffer.

Ho provato in diversi modi ma senza successo.

Heeeeelp ^^.

Grazie

 

Grazie per tutto il vostro supporto. Sto imparando di più e con tutto il vostro aiuto ho risolto tutte le mie richieste...MA.

Ne ho un'altra^^.

Ho bisogno di creare una funzione vuota da richiamare e deve essere la fusione di questi due codici.

Il primo trova l'ultimo ordine aperto e il secondo trova il numero dell'ordine aperto che ha il prezzo aperto più alto.

Ho bisogno di fare una funzione per avere direttamente il numero dell'ordine che ha l'openorderprice più alto.

Grazie

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:
Grazie per tutto il vostro supporto. Sto imparando di più e con tutto il vostro aiuto ho risolto tutte le mie richieste...MA.

Ne ho un altro^^.

Ho bisogno di creare una funzione vuota da richiamare e deve essere l'unione di questi due codici.

Il primo trova l'ultimo ordine aperto e il secondo trova il numero dell'ordine aperto che ha il prezzo aperto più alto.

Ho bisogno di fare una funzione per avere direttamente il numero dell'ordine che ha l'openorderprice più alto.

Grazie

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

}

Ho fatto un errore sul secondo codice. È giusto

[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

La funzione void è una funzione che non restituisce alcun valore. Se questo è il caso, allora l'unico modo ragionevole per farlo è usare qualche variabile che sarà passata per riferimento alla funzione (nella mia esperienza l'uso di variabili di ambito globale per questo scopo è una pratica molto cattiva - evita le regole strutturate di codifica, e, nei casi in cui l'errore deve essere cercato, è un incubo quando tali variabili sono usate). È questo che avevi in mente?

dasio:
Ho fatto un errore sul secondo codice. È giusto
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 funzione void è una funzione che non restituisce alcun valore. Se questo è il caso allora l'unico modo ragionevole per farlo è usare qualche variabile che sarà passata per riferimento alla funzione (nella mia esperienza usare variabili di ambito globale per questo scopo è una pratica molto cattiva - evita le regole strutturate di codifica, e, nei casi in cui l'errore deve essere cercato, è un incubo quando tali variabili sono usate). È questo che avevi in mente?

Grazie per la vostra risposta,

Ho bisogno solo del numero di acquisto che hanno più alto openorder e più basso openorderm rispetto all'ultimo ordine di acquisto aperto.

Devo usare il risultato come moltiplicatore in una funzione vois per qualche controllo.

Così è molto più semplice richiamare questo record quando richiesto. Forse in questo modo posso richiamarlo semplicemente CalculateCurrentBuy(Symbol())

int CalculateHighestbuy(string symbol) {

int Hopen=0;

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

code here

}

}

return(Hopen);

}

 

griglia di trascinamento?

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

}

}

}

Questo codice seguirà 2 ordini, ma come posso modificarlo per seguirne altri? Non appena provo a impostare il codice di trailing per più livelli come il codice della griglia di cui sopra si trasforma in crema.

Qualsiasi intuizione sarebbe apprezzata.

Saluti CJA

 

...

cja

Ho provato con il seguente codice e funziona bene (vedi l'immagine di esempio: diversi passi già applicati)

Non sapevo a cosa servissero le variabili s.ticketP e b.ticketP e le ho usate come si vede nel codice

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

}

}

}

Questo codice seguirà 2 ordini ma come posso modificarlo per seguirne di più? Non appena provo a impostare il codice di tracciamento per più livelli come il codice della griglia sopra, diventa una crema.

Qualsiasi intuizione sarebbe apprezzata.

Saluti CJA
File:
stopd.gif  36 kb
 

Griglia di trascinamento

mladen:
cja

Ho provato con il seguente codice e funziona bene (vedi l'immagine di esempio: diversi passi già applicati)

Non sapevo a cosa servissero le variabili s.ticketP e b.ticketP, quindi le ho usate come si vede nel codice

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

}

Ciao mladen,

Grazie per il tuo aiuto, ma forse non sono stato molto chiaro nel mio post precedente. Non ho un problema con l'impostazione di una griglia, il problema che ho è l'inseguimento della griglia senza perdere la separazione degli ordini.

s.ticketP & b.ticketP si riferisce semplicemente al codice degli ordini pendenti BUYSTOP & SELLSTOP usato altrove nell'EA.

Saluti CJA

 

Griglia di trascinamento

cja:
Ciao mladen,

Grazie per il vostro aiuto, ma forse non sono stato molto chiaro nel mio post precedente. Non ho un problema con l'impostazione di una griglia, il problema che ho è il trailing della griglia senza perdere la separazione degli ordini.

s.ticketP & b.ticketP si riferisce semplicemente al codice degli ordini pendenti BUYSTOP & SELLSTOP usato altrove nell'EA.

Saluti CJA

Ciao mladen,

Hai tempo per dare un'occhiata a questo?

Cordiali saluti CJA