[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 497

 
sss2019:

Dimmi come scrivere un EA su questa condizione:

Ci sono tre coppie di valute su cui l'EA aprirà operazioni e l'EA è attaccato a un solo grafico e sugli altri due lavora da solo, in generale, multicurrency.

La seconda condizione è quando il prezzo raggiunge un certo livello su una qualsiasi delle coppie di valute, si apre un accordo. Si può aprire un solo affare alla volta.

Non appena l'affare è chiuso, l'Expert Advisor può riaprire l'affare in qualsiasi coppia se il prezzo si avvicina.

Ho impostato una variabile statica in modo che finché il valore della variabile è falso, le operazioni possono essere aperte e non appena l'ordine viene aperto su una qualsiasi delle coppie, la variabile assume il valore vero. Non appena l'ordine viene chiuso e il ciclo for non trova nessuna operazione, la variabile assume nuovamente il valore false.

E se per esempio si deve aprire un solo trade per ogni coppia, significa che ogni coppia ha la sua variabile.

C'è una soluzione più razionale a questo problema?


C'è un parametro come "Magik" nell'ordine - basta contare gli ordini con un certo magik e permettere o proibire gli scambi.
 

Come si chiudono correttamente gli ordini e come si raccolgono le informazioni su di essi?

Mi scuso per le domande stupide in anticipo) ho scritto il seguente algoritmo: voglio aprire una posizione di acquisto quando l'apertura è inferiore al frattale up e la chiusura è superiore al frattale up, e una posizione di vendita quando l'apertura è superiore al frattale down e la chiusura è inferiore; voglio anche chiudere tutte le posizioni se sono short di 85 punti o se l'ordine è aperto entro 38 candele (cost. S).Ho la sensazione che non venga chiuso proprio niente, solo ordini chiusi e in generale ho la sensazione che sto trattando gli ordini nel modo sbagliato, opero in modo sbagliato e poi li chiudo nel modo sbagliato)) Per favore, ditemi come chiuderli correttamente, in modo che non scivolino chiusi e dove ci sono errori in questo codice. O può essere un esempio di come nyu cammina, in cui tutte queste operazioni sono fatte adeguatamente. Grazie in anticipo per il vostro aiuto!)


extern int S=38; //numero di candele, dopo le quali la posizione sarà chiusa
extern int SL=85; //lo stop, al quale le posizioni saranno chiuse in ogni caso
extern int HIGH=0; //su quale timeframe saranno cercati gli estremi (5 o 1 o 0(D1))
extern int l=1; //numero di lotti da tradare
int massorder[30][30]; //ci sono dati su lotti OPEN
int numb=1; //il numero di el-ta nell'array, che è oot. lotto aperto
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0;

int start()

{
if(Hour()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}
//----
if(Open[1]<up && Close[1]>up)//se la candela è più bassa all'apertura e più bassa alla chiusura del livello frattale up, allora
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata();
}
if(Open[1]>down && Close[1]<down)//se la candela è più alta in apertura e più bassa in chiusura del livello frattale down, allora
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i==S)
{
closeAllticket();
closeAllPos();
}
i++;
//----
x=Ora();
if(Ora()==23)
x=-1;
return(0);
}
//+------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}
}
void searchH1()//funzione per trovare il frattale
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &&& iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5))
highH1=iHigh(Symbol(),PERIOD_H1,3)

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
return (0);

}

void savedata() //programma per salvare i dati nell'array
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice();
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType()==OP_BUY)
massorder[numb][4]=0;
if(OrderType()==OP_SELL)
massorder[numb][4]=1;
numb++;

}
 
Qwertee:

Come si chiudono correttamente gli ordini e come si raccolgono le informazioni su di essi?

Mi scuso per le domande stupide in anticipo) ho scritto il seguente algoritmo: voglio aprire una posizione di acquisto quando l'apertura è inferiore al frattale up e la chiusura è superiore al frattale up, e una posizione di vendita quando l'apertura è superiore al frattale down e la chiusura è inferiore; voglio anche chiudere tutte le posizioni se sono short di 85 punti o se l'ordine è aperto entro 38 candele (cost. S).Ho la sensazione che non venga chiuso proprio niente, solo ordini chiusi e in generale ho la sensazione che sto trattando gli ordini nel modo sbagliato, opero in modo sbagliato e poi li chiudo nel modo sbagliato)) Per favore, ditemi come chiuderli correttamente, in modo che non scivolino chiusi e dove ci sono errori in questo codice. O può essere un esempio di come nyu cammina, in cui tutte queste operazioni sono fatte adeguatamente. Grazie in anticipo per il vostro aiuto!)


Nelle variabili globali, dove avete specificato gli arresti all'inizio

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

prima di aprire gli ordini:

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

nel segnale per aprire

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

alla fine dell'EA

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

Credo di non aver dimenticato nulla

 
belck:


nelle variabili globali, dove avete specificato gli arresti all'inizio

prima dell'apertura degli ordini:

nel segnale per aprire

alla fine dell'EA

come se niente fosse stato dimenticato



Ho messo tutto quello che hai scritto ma ancora niente è cambiato per qualche motivo. il risultato è lo stesso che era e rimane ancora, gli ordini rimangono aperti per una grande quantità di tempo, e ho bisogno che si chiudano dopo le barre S, che cosa è?????????????????

File:
ikdgna.mq4  7 kb
 
Qwertee:


Ho messo tutto quello che hai scritto ma ancora niente è cambiato. il risultato è come era e come è ora, gli ordini sono ancora aperti un sacco di tempo e ho bisogno che si chiudano dopo le barre S, qual è l'affare?????????????????

La chiamata a chiudere gli ordini dovrebbe essere fatta prima dell'apertura degli ordini. Ho questi in chiusura:

prima del più globale

#include <stdlib.mqh>


La metto così prima di aprire gli ordini:

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

e questo alla fine dell'EA

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

Domanda agli esperti, ci sono dei criteri per gli EA, come il numero minimo di lotti per un certo periodo di tempo del test? Percentuale di perdita, ecc.

Ho solo 2 EAs, e fanno 100 scambi all'anno, e un altro fa 30 scambi in tutto... (tempi 15, 30 rispettivamente). La redditività è buona, la prima è in una demo su quotazioni reali, ora è in fase di test ... ma qualcuno può dirmi se c'è una migliore ... Ma forse qualcuno mi dirà se ci sono test migliori che in MT4?

 
Puoi dirmi come eseguire una condizione? Abbiamo una condizione per aprire un ordine di acquisto al prezzo corrente non appena il prezzo raggiunge 1,2550. Quindi, quando il prezzo è superiore o uguale a 1,2550, l'ordine viene aperto e quando l'ordine viene aperto, la variabile statica blocca l'apertura di nuovi ordini, fino a quando l'ordine raggiunge lo 0. Quindi, non appena l'ordine viene chiuso e non ci sono più ordini con questa magia, il divieto di apertura viene rimosso e viene aperto un nuovo ordine, ma il prezzo si è già allontanato da questo livello. Abbiamo bisogno che l'Expert Advisor apra gli ordini a mercato quando il prezzo raggiunge questo livello, non quelli pendenti.
 

Ciao a tutti gli intenditori))))

C'è un indicatore che disegna una linea di tendenza sugli ultimi due frattali, ma la disegna dopo un "frattale non confermato", cioè la seconda barra non si è ancora formata dopo il frattale ma la linea è già stata disegnata. Come farlo disegnare dopo la seconda barra ma non dopo la prima? L'indicatore è nella scheda.

File:
 
rigc:

Ciao a tutti gli intenditori))))

C'è un indicatore che disegna una linea di tendenza sugli ultimi due frattali, ma la disegna dopo un "frattale non confermato", cioè la seconda barra non si è ancora formata dopo il frattale ma la linea è già stata disegnata. Come farlo disegnare dopo la seconda barra ma non dopo la prima? L'indicatore è nella scheda.


Prova
File:
 
Figar0:

Prova
non disegnando affatto)))
Motivazione: