Scriverò un EA gratuitamente - pagina 21

 
Vitalii Ananev:

Intendete aprire le transazioni all'apertura di una candela D1? Se è così, specificate nella logica dell'Expert Advisor le condizioni per aprire le transazioni solo in un determinato momento.

Capisco. E un'altra domanda: ho messo due ordini pendenti a +15 pip dal prezzo, e un SellStop e un ByStop. E ad ogni tick li sposto ad un nuovo prezzo. Non appena il prezzo li tocca durante forti movimenti di prezzo (il più delle volte durante eventi di notizie) il terminale si blocca. (Perché si blocca?
 
MIR_KAZAN:
Capisco. E un'altra domanda: ho impostato due ordini pendenti a +15 pip dal prezzo: buystop e sellstop. E ad ogni tick li sposto ad un nuovo prezzo. Non appena il prezzo li tocca durante forti movimenti di prezzo (il più delle volte durante eventi di notizie) il terminale si blocca. (Perché si blocca?

Non posso dire perché si blocca, non sono un sensitivo, occupatevi del codice dell'Expert Advisor. Posso supporre che dopo che l'ordine è stato eseguito, il tuo EA cerca di spostarlo a un nuovo prezzo, ma poiché l'ordine pendente è già sul mercato, il tuo EA si blocca. Prova a visualizzare nel log lo stato delle variabili chiave dell'Expert Advisor per analizzare la sua logica di funzionamento.

 
Vitalii Ananev:

Non posso dire perché si blocca, non sono un sensitivo, occupatevi del codice dell'Expert Advisor. Posso supporre che dopo che l'ordine è stato eseguito, il tuo EA cerca di spostarlo a un nuovo prezzo, ma poiché l'ordine pendente è già sul mercato, il tuo EA si blocca. Prova a visualizzare nel log lo stato delle variabili chiave dell'EA per analizzare la logica del suo lavoro.

Penso di aver impostato tutte le condizioni correttamente:

input int    Magic = 12;          // Магический номер ордеров
input int    Proskalzivanie = 5;  // Проскальзывание
input int    period = 200;        // Количество свечей для анализа волятильности
input int    tral = 20;           // Дистанция траллинга в пунктах
input int    tral_step = 3;       // Шаг срабатывания траллинга
input bool   use_step = true;     // Использовать шаг
input double Lot = 0.01;          // Лот
input double otstups = 0.0006;    // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
     OrderMagicNumber()==_Magic && OrderType()<2)
     {
      double SLPrice;
      if (OrderType()==OP_BUY)
      {
       if (_Step_Use)
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
        {
         SLPrice=NormalizeDouble(Ask-_Tral,Dig);
         if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
        }
       }
       else
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
         {
          SLPrice=NormalizeDouble(Bid+_Tral,Dig);
          if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
         }
       }
      }
    }
  }
}

void OnTick()
  {
//---
  double lot=Lot_Normalize(Symbol(),Lot,1);
  double sl= Dist_Normalize(Symbol(),tral);
  double step=Dist_Normalize(Symbol(),tral_step);
  double otstup=NormalizeDouble(otstups,Digits);
  int ord[8];
  Uchet_Orderov_Function(Symbol(),Magic,ord);
  if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
   {
    Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
   {
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  }
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
 double summ=0;
 for (int i=1; i<=_period; i++)
  {
   summ+=MathAbs(High[i]-Low[i]);
  }
 return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
 double minlot = MarketInfo(_Symvol,MODE_MINLOT);
 double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
 double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
 double lot=_lot*_mult;
 if (lot<=minlot)lot=minlot;
 else if(lot>=maxlot) lot=maxlot;
 else if (lot>minlot && lot<maxlot)
 {
  int k=int((lot-minlot)/steplot);
  lot=NormalizeDouble(minlot+k*steplot,2);
 }
 return(lot);
}

double Dist_Normalize(string _Simvol, int _Distancia)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 double Pip=MarketInfo(_Simvol,MODE_POINT);
 if(Dig==3 || Dig==5)
  return NormalizeDouble(_Distancia*5*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
 ArrayInitialize(_Mas,0);
 int Ticket=-1;
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
    OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
    {
     Ticket=OrderTicket();
     switch(OrderType())
     {
      case 0:{_Mas[0]++;_Mas[6]++;break;}
      case 1:{_Mas[1]++;_Mas[6]++;break;}
      case 2:{_Mas[2]++;_Mas[7]++;break;}
      case 3:{_Mas[3]++;_Mas[7]++;break;}
      case 4:{_Mas[4]++;_Mas[7]++;break;}
      case 5:{_Mas[5]++;_Mas[7]++;break;}
     }
    }
  }
}

void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
 for(int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
  {
   if(OrderType()>1)
   {
    if (!OrderDelete(OrderTicket(),clrNONE))
     Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
   }
  else
   {
    if (OrderType()==OP_BUY)
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
    else
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
   }
  }
}

}

 
khorosh:
Non tieni conto che il limite di acquisto può essere impostato solo sotto il prezzo e il limite di vendita sopra il prezzo. Per quello che suggerisci è necessario utilizzare gli ordini di stop.

Sono d'accordo, grazie per aver capito il mio algoritmo confuso. Sono ancora confuso sui nomi dei ciondoli...

Che si fermino, forse dovremmo provare a costruire un EA?

Lo testerò più tardi e mostrerò cosa succede?

... O dammi un link, non è che ho scoperto l'America?

 
MIR_KAZAN:

Penso di aver impostato correttamente tutte le condizioni di prova:

input int    Magic = 12;          // Магический номер ордеров
input int    Proskalzivanie = 5;  // Проскальзывание
input int    period = 200;        // Количество свечей для анализа волятильности
input int    tral = 20;           // Дистанция траллинга в пунктах
input int    tral_step = 3;       // Шаг срабатывания траллинга
input bool   use_step = true;     // Использовать шаг
input double Lot = 0.01;          // Лот
input double otstups = 0.0006;    // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
     OrderMagicNumber()==_Magic && OrderType()<2)
     {
      double SLPrice;
      if (OrderType()==OP_BUY)
      {
       if (_Step_Use)
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
        {
         SLPrice=NormalizeDouble(Ask-_Tral,Dig);
         if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
        }
       }
       else
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
         {
          SLPrice=NormalizeDouble(Bid+_Tral,Dig);
          if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
         }
       }
      }
    }
  }
}

void OnTick()
  {
//---
  double lot=Lot_Normalize(Symbol(),Lot,1);
  double sl= Dist_Normalize(Symbol(),tral);
  double step=Dist_Normalize(Symbol(),tral_step);
  double otstup=NormalizeDouble(otstups,Digits);
  int ord[8];
  Uchet_Orderov_Function(Symbol(),Magic,ord);
  if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
   {
    Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
   {
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  }
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
 double summ=0;
 for (int i=1; i<=_period; i++)
  {
   summ+=MathAbs(High[i]-Low[i]);
  }
 return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
 double minlot = MarketInfo(_Symvol,MODE_MINLOT);
 double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
 double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
 double lot=_lot*_mult;
 if (lot<=minlot)lot=minlot;
 else if(lot>=maxlot) lot=maxlot;
 else if (lot>minlot && lot<maxlot)
 {
  int k=int((lot-minlot)/steplot);
  lot=NormalizeDouble(minlot+k*steplot,2);
 }
 return(lot);
}

double Dist_Normalize(string _Simvol, int _Distancia)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 double Pip=MarketInfo(_Simvol,MODE_POINT);
 if(Dig==3 || Dig==5)
  return NormalizeDouble(_Distancia*5*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
 ArrayInitialize(_Mas,0);
 int Ticket=-1;
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
    OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
    {
     Ticket=OrderTicket();
     switch(OrderType())
     {
      case 0:{_Mas[0]++;_Mas[6]++;break;}
      case 1:{_Mas[1]++;_Mas[6]++;break;}
      case 2:{_Mas[2]++;_Mas[7]++;break;}
      case 3:{_Mas[3]++;_Mas[7]++;break;}
      case 4:{_Mas[4]++;_Mas[7]++;break;}
      case 5:{_Mas[5]++;_Mas[7]++;break;}
     }
    }
  }
}

void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
 for(int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
  {
   if(OrderType()>1)
   {
    if (!OrderDelete(OrderTicket(),clrNONE))
     Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
   }
  else
   {
    if (OrderType()==OP_BUY)
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
    else
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
   }
  }
}

}

Temo di non poterti aiutare perché il tuo codice non si presta all'analisi. Forse potete aggiungere qualche commento per migliorare la vostra comprensione. Non è chiaro a cosa serva l'array ord[] e quali dati memorizzi. Ho capito il tuo codice in questo modo: ogni tick scrivi il tipo di ordine nell'array (Uchet_Orderov_Function(Symbol(),Magic,ord);) poi controlla la condizione if(ord[7]==2 && ord[6]==0 && Volume[0]==1) e se è vero, gli ordini pendenti saranno cancellati e tutte le posizioni saranno chiuse. Poi controlliamo la condizione se (ord[6]==0 && ord[7]==0 && Volume[0]==1) e se è vero, vengono aperti due ordini pendenti. Ma il valore dell'array ord[] non sarà aggiornato prima di verificare la condizione se (ord[6]==0 && ord[7]==0 && Volume[0]==1). E sarà aggiornato solo al secondo tick.

Quindi è necessario registrare tutti i valori dell'array ord[] che influenzano la sua logica.

Notate anche questo frammento di codice:

 if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  } 

Credo che manchino delle parentesi software { . Dovrebbe essere così:

 if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
       if (!OrderDelete(OrderTicket(),clrNONE))
          Print("Ошибка удаления ордера!: ", GetLastError());
   }
  } 
 
Vitalii Ananev:


Notate anche questo pezzo di codice:

Credo che manchino le parentesi { . Dovrebbe essere così:

In questo caso, le parentesi non influiscono sul funzionamento (logica). Non c'è nessun errore

 
Victor Nikolaev:

In questo caso, le parentesi non hanno alcun effetto sul funzionamento (logica). Non c'è nessun errore.

Forse no, ma è più facile da leggere.
 
akarustam:

Sono d'accordo, grazie per aver capito il mio algoritmo confuso. Sono ancora confuso sui nomi dei ciondoli...

Che si fermino, forse dovremmo provare a costruire un EA?

Lo testerò più tardi e mostrerò cosa succede?

... O dammi un link a uno, non è che ho scoperto l'America?

Per suggerire qualcosa, si dovrebbe avere almeno una conoscenza di base. Tutte le idee semplici sono state provate da tempo e non avete davvero scoperto l'America. Ma cercate di collegare attraverso i forum e kodobase improbabile che lo farà. Se ne hai bisogno, lo cerchi. O pensi che ci siano persone che tengono nella loro mente link a tutti i tipi di Expert Advisors, script e indicatori?
 
khorosh:
Bisogna avere almeno delle conoscenze di base per suggerire qualcosa. Tutte le idee semplici sono state provate da molto tempo e infatti non avete scoperto l'America. Ma è probabile che nessuno cerchi un link per te sui forum e su kodobase. Se ne hai bisogno, lo cerchi. O pensi che ci siano persone che tengono nella loro mente link a tutti i tipi di Expert Advisors, script e indicatori?
...assunto.
 

(Ho un'idea, ho bisogno di aiuto)) Scrivere un Expert Advisor per questo

Lo sto usando per il trading da molto tempo. Ottengo 1000 pips mensili su una coppia di valute. Nonsono mai stato abituato a fare trading sul mio forex, e non sono mai stato abituato a comprare coppie. Non c'è praticamente nessun drawdown, massimo 5 pips.

Timeframe H4

1. MA4/semplicemente chiuso

2. MA5/semplice/aperto

Il principio di funzionamento dovrebbe essere così
Senza Take Profit e Stop Loss. Aprire e chiudere operazioni solo sui crossover. Per esempio, incrociare dal basso verso l'alto, aprire un ordine in alto, chiudere l'ordine solo quando è incrociato indietro. Se c'è un segnale inverso per chiudere l'ordine di acquisto aprire l'ordine di vendita. In generale, spero che tu capisca) nella strategia non è nemmeno il profitto che conta, ma questi crossover cazzo) Qualcosa come questo) Commercio su questa strategia per un lungo periodo, il profitto è buono, ma dal momento che penso di scrivere questa strategia esperto consulente non sarà difficile.

Se siete d'accordo ad aiutare, ecco il mio MAIL: 4iterRrock@mail.ru

Qui sotto c'è il mio modello che ho scambiato per quasi un anno.

File:
MAxi2r.tpl  2 kb
Motivazione: