Domanda per gli intenditori

 

Salve. Gli esperti di programmazione possono aiutare.

Expert Advisor: Acquistare - incrocio di stocastico e il segnale a zona di ipervenduto (sotto 25), a condizione che

Il pivot è sotto il livello del prezzo (una sorta di supporto); al contrario, il pivot è sopra il livello del prezzo.

I test hanno mostrato alcuni difetti di programmazione. 1) Come aprire un solo trade per segnale (durante i test ho perso tutto, quando il segnale è ancora attivo (falso), e la condizione di chiusura della posizione è già avvenuta). 2) se ho impostato correttamente la condizione che Pivot è sopra / sotto il livello di prezzo. Ho dubbi, guardando il grafico di test.

Se posso aiutare con esempi specifici. Conosco la programmazione a livello di semplice compilazione !!!!!!!.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
doppio P_up0,P_down0,P_up1,P_down1;
doppio st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, totale;

se(Bars<100)
{
Stampa("barre inferiori a 100");
ritorno(0);
}
P_up0=iCustom(0,0, "Canale dei prezzi",11,0,0);
P_down0=iCustom(0,0, "Canale dei prezzi",11,1,0);
P_up1=iCustom(0,0, "Canale dei prezzi",11,0,1);
P_down1=iCustom(0,0, "Canale dei prezzi",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//impostare tutti i dati

total=OrdersTotal();
se(totale<1)
{
// Controlla il margine libero
se(AccountFreeMargin()<(1000*Lots))
{
Print("Non abbiamo soldi. Free Margin = ", AccountFreeMargin();
ritorno(0);
}
// condizione di apertura della posizione BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,0,Green);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto: ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
ritorno(0);
}
//condizione di posizione SELL aperta
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,0,Red);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Stampa("Ordine SELL aperto: ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError());
ritorno(0);
}
ritorno(0);
}
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
se(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posizione lunga aperta
{
// condizione di chiusura della posizione lunga
se(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
ritorno(0);
}
}
else
{
// condizione di chiusura della posizione corta
se(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
ritorno(0);
}
}
}
}
ritorno(0);
}




File:
pivot.mq4  2 kb
 
Kostay:

Salve. Gli esperti di programmazione possono aiutare.

Expert Advisor: Acquistare - incrocio di stocastico e il segnale a zona di ipervenduto (sotto 25), a condizione che

Il pivot è sotto il livello del prezzo (una sorta di supporto); al contrario, il pivot è sopra il livello del prezzo.

I test hanno mostrato alcuni difetti di programmazione. 1) Come aprire un solo trade per segnale (durante i test ho perso tutto, quando il segnale è ancora attivo (falso), e la condizione di chiusura della posizione è già avvenuta). 2) se ho impostato correttamente la condizione che Pivot è sopra / sotto il livello di prezzo. Ho dubbi, guardando il grafico di test.

Se posso aiutare con esempi specifici. So fare programmazione a livello di semplice compilazione !!!!!!!

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
doppio P_up0,P_down0,P_up1;
doppio st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, totale;

se(Bars<100)
{
Stampa("barre inferiori a 100");
ritorno(0);
}
P_up0=iCustom(0,0, "Canale dei prezzi",11,0,0);
P_down0=iCustom(0,0, "Canale dei prezzi",11,1,0);
P_up1=iCustom(0,0, "Canale dei prezzi",11,0,1);
P_down1=iCustom(0,0, "Canale dei prezzi",11,1,1);
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0,Pivot,0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//impostare tutti i dati

total=OrdersTotal();
se(totale<1)
{
// Controlla il margine libero
se(AccountFreeMargin()<(1000*Lots))
{
Print("Non abbiamo soldi. Free Margin = ", AccountFreeMargin();
ritorno(0);
}
// condizione di apertura della posizione BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,0,Green);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto: ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
ritorno(0);
}
//condizione di posizione SELL aperta
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,0,Red);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Stampa("Ordine SELL aperto: ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError());
ritorno(0);
}
ritorno(0);
}
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
se(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posizione lunga aperta
{
// condizione di chiusura della posizione lunga
se(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
ritorno(0);
}
}
else
{
// condizione di chiusura della posizione corta
se(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
ritorno(0);
}
}
}
}
ritorno(0);
}

1) come fare un solo affare aperto ad un segnale

Mi serve così:

if(total<1) 
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
         

if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Alert("Покупка: ",OrderOpenPrice());                      
           }
         else Alert("ошибка:по цене ",OrderOpenPrice()); 
         return(0); 
        }
        
        
     return(0);
     }
 
Ho perso tutto il mio deposito nello stesso punto!
 

Ancora non capisco cosa ho cambiato in questo codice. sembra essere lo stesso!

E ancora, come posso programmarla per aprire solo una posizione per segnale?

E se una posizione è stata chiusa sulla stessa barra (cioè, il segnale è ancora attivo), allora non se ne dovrebbe aprire una nuova.

 
Kostay:

...Tuttavia, come posso programmarlo per aprire solo una posizione per segnale?

E se una posizione sulla stessa barra è stata chiusa (cioè il segnale è ancora attivo), allora una nuova posizione non dovrebbe essere aperta.

Se il tempo di apertura degli ordini, compresi quelli chiusi, appartiene alla barra corrente (su cui è apparso il segnale), allora stiamo fumando sulla barricata.

All'incirca così:

bool flag=true;
int cnt=OrdersTotal()-1;
for(int i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
if(!flag) return; 
 

Come può essere aperta più di 1 posizione alla volta se questo è presente:

total=OrdersTotal();
if(total<1)

?
 

Ho inserito il tuo codice nell'EA. ma il risultato è lo stesso.

Devo aver inserito male la cornice. si prega di rivedere.

extern double Lots = 0.1;
bool flag=true;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
int cnt, ticket, total;

if(Bars<100)
{
Print("barre meno di 100");
return(0);
}
P_up0=iCustom(0,0, "Prezzo canale",11,0,0);
P_down0=iCustom(0,0, "Prezzo canale",11,1,0);
P_up1=iCustom(0,0, "Prezzo canale",11,0,1);
P_down1=iCustom(0,0, "Prezzo canale",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
Pivot=iCustom(0,0, "Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//impostare tutti i dati

total=OrdersTotal();
if(total<1)
{
// Controllare il margine libero
if(AccountFreeMargin()<(1000*Lots))
{
Print("Non abbiamo soldi. Free Margin = ", AccountFreeMargin());
return(0);
}
// Condizione di apertura della posizione BUY
if(st_m2>st_s2&st_m1>st_s1&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"", 0,0,0,Green);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Acquisto: ",OrderOpenPrice());
}
else Alert("errore:prezzo ",OrderOpenPrice());
return(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderOpenTime()>=Time[0]) { // Time[0] - se la posizione si apre sulla barra zero del simbolo corrente
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continua;
if(OrderOpenTime()>=Time[0]) { // Time[0] - se la posizione è aperta sulla barra zero del simbolo corrente
flag=false;
break;
}
}
if(!flag) return;
// Condizione di apertura della posizione SELL
if(st_m2<st_s2&st_m1<st_s1&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0",0,0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Acquisto: ",OrderOpenPrice());
}
else Alert("errore:prezzo ",OrderOpenPrice());
return(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderOpenTime()>=Time[0]) { // Time[0] - se la posizione si apre sulla barra zero del simbolo corrente
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continua;
if(OrderOpenTime()>=Time[0]) { // Time[0] - se la posizione si apre sulla barra zero del simbolo corrente
flag=false;
break;
}
}
if(!flag) return;
return(0);
}
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // posizione lunga aperta
{
// condizione per chiudere la posizione lunga
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)

return(0);
}
}
else
{
// condizione di chiusura della posizione short
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
}
return(0);
}




 
D500_Rised:

Come può esserci più di 1 posizione aperta allo stesso tempo se questo è presente:

total=OrdersTotal();
if(total<1)

?

Non si apre più di 1 posizione contemporaneamente!!!!!!! segnale apparso - posizione aperta. sulla stessa barra zero il prezzo è andato nella direzione opposta e la condizione di chiusura della posizione è valida. si chiude di conseguenza, sulla stessa barra zero. Ma l'azione del segnale non è stata annullata. la posizione si apre e si chiude di nuovo, mentre va nella direzione opposta.

Quindi la domanda è: come fare in modo che un segnale apra solo una posizione, anche se si chiude con un nuovo tick?

 
Allora devi fare un divieto sul commercio intrabarico passare attraverso la ricerca con queste parole chiave, lo troverai.
 
Kostay:

Ho inserito il tuo codice nell'EA. ma il risultato è lo stesso.

Devo aver inserito il codice in modo errato.

Per favore, ma la prossima volta incolla il codice attraverso il pulsante

Non dovrebbero esserci errori, ma non l'ho testato.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
      
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 

La cosa strana sta succedendo con l'Expert Advisor ora. non funziona con le chiusure delle posizioni. ci possono essere diverse posizioni dello stesso tipo aperte e attive allo stesso tempo. E il risultato: tutto sta perdendo sullo stesso problema, anche se in una versione modificata!

Motivazione: