Je rédigerai un conseiller gratuitement - page 21

 
Vitalii Ananev:

Voulez-vous dire d'ouvrir des transactions à l'ouverture d'une bougie D1 ? Si c'est le cas, paramétrez la logique du conseiller expert pour qu'il n'ouvre des transactions qu'à un moment donné.

Je vois. Et une autre question : j'ai placé deux ordres en attente à +15 pips du prix, et un SellStop et un ByStop. Et à chaque tic, je les déplace vers un nouveau prix. Dès que le prix les touche lors de fortes variations de prix (le plus souvent lors d'événements d'actualité), le terminal se bloque. (Pourquoi est-ce qu'il gèle ?
 
MIR_KAZAN:
Je vois. Et une autre question : j'ai placé deux ordres en attente à +15 pips du prix : buystop et sellstop. Et à chaque tic, je les déplace vers un nouveau prix. Dès que le prix les touche lors de fortes variations de prix (le plus souvent lors d'événements d'actualité), le terminal se bloque. (Pourquoi est-ce qu'il gèle ?

Je ne peux pas dire pourquoi ça raccroche, je ne suis pas un médium, occupez-vous du code de l'Expert Advisor. Je peux supposer qu'après l'exécution de l'ordre, votre EA essaie de le déplacer vers un nouveau prix, mais comme l'ordre en attente est déjà sur le marché, votre EA se bloque. Essayez d'afficher dans le journal l'état des variables clés du conseiller expert pour analyser sa logique de fonctionnement.

 
Vitalii Ananev:

Je ne peux pas dire pourquoi il raccroche, je ne suis pas un médium, occupez-vous du code de l'Expert Advisor. Je peux supposer qu'après l'exécution de l'ordre, votre EA essaie de le déplacer vers un nouveau prix, mais comme l'ordre en attente est déjà sur le marché, votre EA se bloque. Essayez d'afficher dans le journal l'état des variables clés de l'EA pour analyser la logique de son travail.

Je pense avoir défini toutes les conditions correctement :

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:
Vous ne tenez pas compte du fait que la limite d'achat ne peut être fixée qu'en dessous du prix et la limite de vente au-dessus du prix. Pour ce que vous suggérez, vous devez utiliser des ordres stop.

D'accord, merci de comprendre mon algorithme confus. Je suis toujours confus quant aux noms des pendentifs...

Laissez-les s'arrêter, peut-être devrions-nous essayer de construire un EA ?

Je le testerai plus tard et montrerai ce qui se passe ?

... Ou donnez-moi un lien vers un site, ce n'est pas comme si j'avais découvert l'Amérique ?

 
MIR_KAZAN:

Je pense avoir défini correctement toutes les conditions de test :

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

}

J'ai peur de ne pas pouvoir vous aider car votre code ne se prête pas à l'analyse. Vous pouvez peut-être ajouter quelques commentaires pour améliorer votre compréhension. On ne sait pas très bien à quoi sert le tableau ord[] et quelles données il stocke. J'ai compris votre code de la façon suivante : à chaque tick vous écrivez le type d'ordre dans le tableau (Uchet_Orderov_Function(Symbol(),Magic,ord) ;) puis vérifier la condition if(ord[7]==2 && ord[6]==0 && Volume[0]==1) et si elle est vraie, les ordres en attente seront supprimés et toutes les positions seront fermées. Ensuite, nous vérifions la condition si (ord[6]==0 && ord[7]==0 && Volume[0]==1) et si elle est vraie, deux ordres en attente sont ouverts. Mais la valeur du tableau ord[] ne sera pas mise à jour avant de vérifier la condition si (ord[6]==0 && ord[7]==0 && Volume[0]==1). Et il ne sera mis à jour que lors du deuxième tic-tac.

Vous devez donc enregistrer toutes les valeurs du tableau ord[] qui affectent sa logique.

Notez également ce fragment de code :

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

Je pense qu'il manque des parenthèses logicielles { . Ça devrait être comme ça :

 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:


Notez également ce morceau de code :

Je pense qu'il manque les parenthèses { . C'est censé être comme ça :

Dans ce cas, les parenthèses n'affectent pas le fonctionnement (logique). Il n'y a pas d'erreur

 
Victor Nikolaev:

Dans ce cas, les parenthèses n'ont aucun effet sur l'opération (logique). Il n'y a pas d'erreur.

Peut-être pas, mais c'est plus facile à lire.
 
akarustam:

D'accord, merci de comprendre mon algorithme confus. Je suis toujours confus quant aux noms des pendentifs...

Laissez-les s'arrêter, peut-être devrions-nous essayer de construire un EA ?

Je le testerai plus tard et montrerai ce qui se passe ?

... Ou donnez-moi un lien vers un site, ce n'est pas comme si j'avais découvert l'Amérique ?

Pour suggérer quelque chose, vous devez avoir au moins des connaissances de base. Toutes les idées simples ont été essayées depuis longtemps et vous n'avez vraiment pas découvert l'Amérique. Mais regardez pour vous de lien à travers les forums et kodobase peu probable qui sera. Vous en avez besoin, vous le cherchez. Ou pensez-vous qu'il y a des gens qui gardent dans leur esprit des liens vers toutes sortes d'Expert Advisors, de scripts et d'indicateurs ?
 
khorosh:
Il faut avoir au moins des connaissances de base pour suggérer quelque chose. Toutes les idées simples ont été essayées depuis longtemps et en effet vous n'avez pas découvert l'Amérique. Mais personne n'est susceptible de chercher un lien pour vous sur les forums et sur kodobase. Vous en avez besoin, vous le cherchez. Ou pensez-vous qu'il y a des gens qui gardent dans leur esprit des liens vers toutes sortes d'Expert Advisors, de scripts et d'indicateurs ?
...supposé.
 

(J'ai une idée, j'ai besoin d'aide)) Écrire un conseiller expert pour cela

Je l'utilise pour le commerce depuis longtemps. J'obtiens 1000 pips par mois sur une paire de devises. Je n'ai jamais eu l'habitude de négocier sur mon forex, et je n'ai jamais eu l'habitude d'acheter des paires. Il n'y a pratiquement pas de drawdown, maximum 5 pips.

Cadre temporel H4

1. MA4/simple\close

2. MA5/simple/ouvert

Le principe de fonctionnement devrait être le suivant
Sans Take Profit et Stop Loss. Ouvrez et fermez des transactions uniquement sur les croisements. Par exemple, croiser de bas en haut, ouvrir un ordre vers le haut, ne fermer l'ordre que lorsqu'il est recroisé. S'il y a un signal inverse pour fermer l'ordre d'achat, ouvrir l'ordre de vente. Généralement, j'espère que vous comprenez) dans la stratégie, ce n'est même pas le profit qui compte, mais ces putains de croisements) Quelque chose comme ça) Trade on this strategy for a long time, the profit is good, but since I think to write this strategy expert advisor will not be difficult.

Si vous acceptez d'aider, voici mon MAIL : 4iterRrock@mail.ru

Voici le modèle que je pratique depuis presque un an.

Dossiers :
MAxi2r.tpl  2 kb