[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 84

 
NameLess:


Comme vous l'avez peut-être remarqué, la véritable raison n'est pas de regarder le code, mais de comprendre comment il fonctionne. Si vous faites confiance au conseiller expert, je vous souhaite de réussir et que tout se passe bien).

J'ai personnellement inventé un vélo et écrit mon hibou à partir de rien, mais je sais où et comment les choses fonctionnent et je sais pourquoi elles ne fonctionnent pas et où chercher les erreurs).

c'est à peu près tout)


Merci. Je suis déjà sur la bonne voie !)))) J'ai dû creuser un peu, mais j'ai implémenté ce que je voulais (au moins, ça fonctionne d'une certaine manière :))) ).
 
NameLess:
Savez-vous comment configurer le contrôle des numéros de commande ? Je suis d'accord, la question suscite probablement un sourire non déguisé, se transformant en rire par endroits.)))) Mais ça ne fait qu'une semaine que je fouille dans les codes mt-sh. Je ne connais pas encore tous les mots )))) Intelligent :)))
 
nemo811:
Savez-vous comment configurer le contrôle des numéros de commande ? Je suis d'accord, la question provoque probablement un sourire non déguisé, qui se transforme en rire à certains endroits)))). Mais ça ne fait qu'une semaine que je fouille dans les codes mt-sh. Je ne connais pas encore tous les mots )))) intelligent ;))


je ne peux pas me qualifier d'expert))))

Je ne suis pas tout à fait sûr de ce que signifie le contrôle des numéros... Si vous devez ouvrir un ordre deux fois sous certaines conditions, alors vous devez créer cette condition.

En général, j'ai commencé à écrire mon propre programme il y a environ six mois, et un détail simple m'a aidé : pensez à ce que vous voulez que l'EA fasse ou à un morceau de code spécifique.

Dans ce cas, il serait plus facile de donner un exemple, et je pourrai alors dire plus précisément ce qu'il faut faire et comment le faire, si je connais la solution :).

 

exemple à la page 83, tâche de sergeev

Le code a fonctionné - merci. Mais lorsque des personnes expérimentées prononcent de tels mots, on commence à se demander ce qui ne va pas.

)))

 
nemo811:

exemple à la page 83, tâche de sergeev

Le code a fonctionné - merci. Mais lorsque des personnes expérimentées prononcent de tels mots, on commence à se demander ce qui ne va pas.

)))


Si le code fait ce qu'il est censé faire - alors c'est tout))) ce que j'ai probablement voulu dire, c'est que le code peut ouvrir des ordres non-stop, mais nous l'avons fait de sorte que tout s'ouvre et se reporte une fois. donc c'est OK)
 
NameLess:

Si le code fait ce qu'il est censé faire, alors c'est OK) ; ce que je voulais probablement dire, c'est que le code peut ouvrir des ordres sans arrêt, mais nous l'avons fait une fois par ouverture et report).

Bien. Merci encore.
 
nemo811:

Au fait, je recommande de mettre quelque chose comme

if ( OrdersTotal()!=0)

{

BUY = false;

BUY_STOP = false;

BUY_LIMIT = false;

SELL = false;

SELL_STOP = false;

SELL_LIMIT = false;

}

il s'agit d'une protection au cas où vous auriez des positions ouvertes et que vous deviez redémarrer le client, sinon il rouvrira tout un lot d'ordres.

je recommande également de demander : pensez logiquement à chaque ligne - ce qui peut l'empêcher de fonctionner.

 
nemo811:

Voici une version légèrement dépassée de ce sur quoi je travaille actuellement. L'auteur drknn m'a donné la permission de le télécharger.


Il ne s'est pas contenté de donner la permission de le mettre en ligne, il a ouvertement donné la permission de modifier le code comme bon vous semble, de le vendre et même d'en faire un copyright à qui vous voulez :)

Mais ne vous battez pas pour les droits là-bas :)

 
Merci !
 
NameLess:

Au fait, je recommande de mettre quelque chose comme

if ( OrdersTotal()!=0)

{

BUY = false;

....

il s'agit d'une protection dans le cas où vous avez des positions ouvertes au cas où vous devez redémarrer le client. sinon, il rouvrira un lot d'ordres entier.

Merci - c'est un point important. J'ai résolu ce problème et ajouté des compteurs (merci à sergeev) pour compter les commandes.

Le code se présente maintenant comme suit (il n'ouvre pas de données inutiles lors du redémarrage du terminal) :

//--------------------------------------------------------------------
extern int     MAGIC       = 0;        //уникальный номер ордера
extern bool    BUY         = false;    //открыть ордер BUY
extern bool    BUY_STOP    = false;    //поставить ордер BUY STOP
extern bool    BUY_LIMIT   = false;    //поставить ордер BUY LIMIT
extern bool    SELL        = false;    //открыть ордер SELL
extern bool    SELL_STOP   = false;    //поставить ордер SELL STOP
extern bool    SELL_LIMIT  = false;    //поставить ордер SELL LIMIT
extern double  Lot         = 0.1;      //объем ордера
extern int     takeprofit  = 0;        //уровень выставления TP, если 0, то TP не выставляется
extern int     stoploss    = 0;        //уровень выставления SL, если 0, то SL не выставляется
extern int     DistanceSet = 40;       //расстояние от рынка для отложенника
extern int     Proskalz    = 3;        //максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
   if (BUY)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy");
      BUY=false;
   }
   if (SELL)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell");
      SELL=false;
   }
   if (BUY_STOP)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask + DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Stop");
      BUY_STOP=false;
   }
   if (SELL_STOP)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid - DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Stop");
      SELL_STOP=false;
   }
   if (BUY_LIMIT)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask - DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Limit");
      BUY_LIMIT=false; 
   }
   if (SELL_LIMIT)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid + DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Limit");
      SELL_LIMIT=false;
   }
return(0);
}
void OPENORDER(string ord)
{
   int SchBuy=SchBuy_b(MAGIC);
   int SchSell=SchSell_b(MAGIC);
   int SchBuyStop=SchBuyStop_b(MAGIC);
   int SchSellStop=SchSellStop_b(MAGIC);
   int SchBuyLimit=SchBuyLimit_b(MAGIC);
   int SchSellLimit=SchSellLimit_b(MAGIC);
   int ticket = -1;
   int err;
   while (ticket<0)
   {
      if (SchBuy<1) {if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSell<1) {if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyStop<1) {if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellStop<1) {if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyLimit<1) {if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT, Lot,NormalizeDouble(Ask - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellLimit<1) {if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(Bid + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}      
      if (ticket==-1) //неудачная попытка
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (ticket || err >10) return;
   }
return;
}                                    
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Нет связи с торговым сервером ",Symbol());return;
      case 3:   Alert("Error неправильные параметры ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}

+ compteurs appropriés.

Merci.

Raison: