Chiedete! - pagina 34

 
AnasFX:
Ok, ha funzionato, ma ora il problema è la performance. Controllare l'intera storia richiede tempo. Ho fatto un backtest per un anno e mezzo e ho notato che è lento. La ragione è che sto controllando tutti gli ordini nella storia e confronto il loro prezzo di chiusura e il tempo di chiusura. Quindi, c'è un modo per limitare la ricerca nella cronologia in modo che cerchi solo gli ordini recenti? Posso aumentare le prestazioni in qualche modo?

si può provare

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);

ma non sono sicuro per questo, penso che prenderà l'ultimo ordine in tutta la storia

grazie

 

ciao gente...

qualcuno può aiutarmi...

Ho un indicatore per creare EA....

 
phoenix:
si può provare

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);

ma non sono sicuro per questo, penso che prenderà l'ultimo ordine in tutta la storia

grazie

modificato del mio difetto...deve essere

OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);

 

Scusate il doppio post ma ho davvero bisogno di aiuto...

Sono disperato. Ho provato tutta la notte a far funzionare il mio array ma non succede niente. Ho cercato davvero di essere autosufficiente e di cercare di imparare, ma non riesco ancora ad arrivare dove devo andare. Se qualcuno potesse avere pietà di me e prestarmi assistenza....PLEASE!!!!!

Sto eseguendo uno script di griglia ma vorrei tenere traccia di quanti lotti sto eseguendo per Symbol. Voglio essere in grado di sommare la mia posizione totale per dimensione del lotto. Diciamo che ho 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, voglio essere in grado di sapere che ho l'equivalente di 0.90 lotti. Vorrei anche sapere le dimensioni minime e massime dei lotti....0.10 e 0.30

ArrayResize(OrderArray, i);

ArrayInitialize(OrderArray,0);

cnt = 0;

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

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

////// I can't get anything to work!!!!!!!

BuyLots += OrderArray[cnt][LOTS];

////// This returns Zero when I place BuyLots in my Comments

////// This returns error messages

MaxBuyLots =ArrayMaximum(OrderArray[LOTS],WHOLE_ARRAY,0);

}

 
deeforex:
Scusa per il doppio post ma ho davvero bisogno di aiuto...

Sono disperato. Ho provato tutta la notte a far funzionare il mio array ma non succede niente. Ho cercato davvero di essere autosufficiente e di cercare di imparare, ma ancora non riesco ad arrivare dove devo andare. Se qualcuno potesse avere pietà di me e prestarmi assistenza....PLEASE!!!!!

Sto eseguendo uno script a griglia ma vorrei tenere traccia di quanti lotti sto eseguendo per Symbol. Voglio essere in grado di sommare la mia posizione totale per dimensione del lotto. Diciamo che ho 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, voglio essere in grado di sapere che ho l'equivalente di 0.90 lotti. Vorrei anche sapere le dimensioni minime e massime dei lotti....0.10 e 0.30

Il problema è che l'arrayresize() ridimensiona solo il primo elemento, non il secondo. Ovviamente le macro LOTS, PROFIT e OPEN devono essere rispettivamente 0,1,2. Anche l'oggetto count nel ciclo for è (i) ma il codice del blocco si riferisce a (cnt). prova questo e vedi se funziona.

double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

MaxBuyLots =ArrayMaximum(OrderArray);

}

 

Grazie Nicholishen,

Mi sto avvicinando un po'. BuyLots sta restituendo ciò che voglio, ma ArrayMaximum mi sta dando un numero strano che non riesco a capire. Non sta restituendo il più grande LotSize.

Apprezzo molto l'aiuto.

dee

 
deeforex:
Grazie Nicholishen,

Mi sto avvicinando un po'. BuyLots sta restituendo ciò che voglio, ma ArrayMaximum mi sta dando un numero strano che non riesco a capire. Non sta restituendo il più grande LotSize.

Apprezzo molto l'aiuto.

dee

Se hai bisogno di dividere l'array in diversi array o scrivere un ciclo per estrarre il massimo dell'array, ad esempio:

double OrderArray...[];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArrayProfit[cnt] = OrderProfit() + OrderSwap();

OrderArrayOpen[cnt] = OrderOpenPrice();

OrderArrayLots[cnt] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArrayLots[cnt];

MaxBuyLots =ArrayMaximum(OrderArrayLots);

}

[/CODE]

or

[CODE]double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

}

double MBL;

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

if(OrderArrayLots[LOTS]>MBL)MBL=OrderArrayLots[LOTS];

}

MaxBuyLots =MBL;

 

Ecco un altro esempio di una funzione che tiene traccia dei trailing stop stretti su più operazioni sulla stessa valuta accoppiando i dati di trailing con il numero di ticket dell'operazione corrispondente, usando degli array. Forse questo vi aiuterà a dare qualche idea.

int tsTicket[21];

double tsPrice[21];

bool tsok[21];

int tkt3[20];

int SuperClose(){// superclose by nicholishen

int cnp=ordercnt();

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

if(OrderMatch(i)){

if(0==0){//Pulls in order that meets the criteria for processing

int num=0;int pos=0;

for(int b=0;b<21;b++){// this (loopB) compares the ticket# of the selected order against the number stored in the ticket array

if(tsTicket==OrderTicket() ){

num++; pos=b;// if ticket numbers match, pos is the position in the array where the trailing data is stored

break;

}

}

if(num==0){ // if the loopB did not find a matching ticket number it is time to initialize the data

for(int j=0;j<21;j++){

if(tsTicket[j]==0){// this is looking for the earliest instance within the array to store the data

pos=j;

break;

}

}

tsTicket[pos]=OrderTicket();// setting the ticket number

tsok[pos]=false;// this is to determine when trailing kicks in

// Print("(",pos,") New ticket initialized = ",tsTicket[pos]);

}

if (OrderType()==OP_SELL) {

if (!tsok[pos] && (OrderOpenPrice()-Ask>=TSactivation*Point || TSactivation==0 ) ) {// if the trailing factor is false, but it has hit the activation point continue

tsPrice[pos]=Ask+TrailPips*Point;// this is the new trailinf stop price

tsok[pos]=true;// it's ok to proceed with trailing stop

if(TrailPips>8){// if this distance from the current price to the new stop, then modify the order.

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());//modifies order

}

}

if (tsok[pos] && Ask+TrailPips*Point < tsPrice[pos] ){//if the position is gaining in profit

tsPrice[pos]=Ask+TrailPips*Point;

if(TrailPips>8){

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Ask >= tsPrice[pos] ){// if the postion hits the stop price

if(CloseOrder(Ask)==STOP)return(STOP);

Print("Short Order ",tsTicket[pos]," Closed from TS");

}

}

else if (OrderType()==OP_BUY) {// reverse of SELL

if(!tsok[pos] && (Bid-OrderOpenPrice() >= TSactivation*Point || TSactivation==0 ) ) {

tsPrice[pos]=Bid-TrailPips*Point;

tsok[pos]=true;

if(TrailPips>8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid-TrailPips*Point > tsPrice[pos] ){

tsPrice[pos]=Bid-TrailPips*Point;

if(TrailPips > 8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid <= tsPrice[pos] ){

if(CloseOrder(Bid)==STOP)return(STOP);

Print("Long Order ",tsTicket[pos]," Closed from TS");

}

}

}

}

if(RefreshRates())return(STOP);

}

for(i=0;i<21;i++){// this searches the array for ticket numbers that are now obsolete due to an order that has closed

if(tsTicket>0){

bool found=false;

for(b=0;b<OrdersTotal();b++){

OrderSelect(b,SELECT_BY_POS);

if(tsTicket==OrderTicket()){

found=true;

break;

}

}

if(!found){// if there are matching ticket numbers in the trade pool and the array then nothing happens

tsTicket=0;tsPrice=0;tsok=false;// if there is an obolete ticket the the data is reset. And the next new ticket data can occupy this space

// Print("Array pos ",i," Cleaned");

}

}

}

return(0);

}

int ordercnt(){

int c;

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

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

tkt3[c]=OrderTicket();

c++;

}

}

}

return(c);

}

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

int curcnt(){

int c;

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

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderSymbol()==Symbol()){

c++;

return(c);

}

}

}

return(c);

}

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

bool OrderMatch(int i){

if(OrderSelect(tkt3,SELECT_BY_TICKET)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

return(true);

}

}

return(false);

}
 

Grazie ancora!

Ho cambiato la 3a dell'ultima linea con questa

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

e l'ho fatto funzionare. L'ora di andare a letto è passata da un pezzo. Domani, quando mi sveglierò, studierò la logica del tuo codice. Ma siccome sono testardo, capirò come usare la maledetta funzione ArrayMaximum! Dovrò anche leggere di più sull'indicizzazione per vedere come i miei vecchi metodi erano così sbagliati.

Grazie ancora!!!!

dee

 
deeforex:
Grazie ancora!

Ho cambiato la 3a dell'ultima linea con questa

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

e l'ho fatto funzionare. L'ora di andare a letto è passata da un pezzo. Domani, quando mi sveglierò, studierò la logica del vostro codice. Ma siccome sono testardo, capirò come usare la maledetta funzione ArrayMaximum! Dovrò anche leggere di più sull'indicizzazione per vedere come i miei vecchi metodi erano così sbagliati.

Grazie ancora!!!!

dee

solo per farti risparmiare tempo, la ragione per cui la funzione max non funzionava per quello che volevi è perché stai usando un array multidimensionale e stai memorizzando diversi tipi di dati. Restituirà il massimo di quei dati, quindi è probabile che tu stia restituendo un numero di profitto o qualcosa di più alto della tua VERA dimensione massima del lotto

Motivazione: