Fonctions utiles de KimIV - page 88

 

kombat 17.07.2009 22:13

Additionnez, obtenez l'achat-été de 3 lots et contre ce volume, la vente de 3 lots.

.......................

En tant qu'option, oui. Cependant, s'il y a déjà des ordres de vente ouverts, l'EA peut ne pas fermer ceux dont vous avez besoin. Il devrait être résolu.

kombat 17.07.2009 22:13.

Mais pour répondre à votre question : est-il possible de fermer toutes les positions ?

oui c'est ça, un par un, c'est quick script, aap ! et c'est tout...

.........................

C'est ce que j'utilise maintenant. Un ensemble de scripts - vous utilisez celui-ci, puis celui-là... Mais j'ai essayé de coder ma stratégie dans Expert Advisor et j'ai rencontré un certain nombre de difficultés.

 
gince >> :
J'ai quelque chose qui ne fonctionne pas ici, cela signifie qu'il ne ferme pas, sans erreur.

Dans la fonction ClosePositions(), sa bibliothèque b-Positions.mqh, KimIV utilise un appel à son autre fonction ClosePosBySelect() qui interdit l'utilisation de ee dans le testeur :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Pour les tests d'histoire, utilisez sa bibliothèque b-ForTest.mqh

 
BoraBo писал(а) >>

Dans la fonction ClosePositions(), sa bibliothèque b-Positions.mqh, KimIV utilise un appel à son autre fonction ClosePosBySelect() qui interdit l'utilisation de ee dans le testeur :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Pour les tests d'histoire, utilisez sa bibliothèque b-ForTest.mqh

Vous avez mal compris mon code... Traduire en russe... Si ce n'est pas le mode test ET (l'EA n'est PAS autorisé à négocier OU le conseiller expert est arrêté), alors la boucle est interrompue. Pour faire simple, cette ligne assure la sortie de la boucle, lorsque vous appuyez sur le bouton "Expert Advisors" de la barre d'outils.

 
Désolé pour la confusion.
 

Bonsoir,

Malheureusement, il y a aussi une divergence avec le tableau... Quand le comptage des ordres est fait avec une condition si les lots sont plus grands que 0 (Lts>0), les lots sont fermés un par un (quand le profit a été atteint), mais le profit total devrait être pris en compte :

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Et à la condition dans le compte des ordres, si les lots sont plus de 1 (Lts>1), les lots ne sont pas fermés :

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Veuillez indiquer qui peut voir l'erreur.

Ou peut-être, Igor, ai-je mal compris l'utilisation de votre fonction ?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY) ; // Appel de la fonction

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()== sy || sy=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return( p);
}
 

Igor, s'il vous plaît, dites-moi comment insérer votre fonction PriceOpenLastPos dans l'indicateur.

Lors de la compilation, l'éditeur donne une erreur sur la première parenthèse et les variables suivantes.

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t ;
double r=0 ;
int k=OrdersTotal() ;

if (sy=="0") sy=Symbol() ;
for (i=0 ; i<k ; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy==") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime() ;
r=OrderOpenPrice() ;
}
}
}
}
}
}
}
return(r) ;
}
}

'(' - définition de fonction inattendue D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variable non définie D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
etc.

J'implémente la logique de formation des signaux de trading dans un indicateur et j'envoie le signal généré à l'Expert Advisor via une variable globale pour ouvrir/fermer les ordres.

J'ai besoin du prix ouvert d'un ordre pour prendre certaines décisions, c'est ce que j'essaie de faire. Mon indicateur est dynamique et ne peut être débogué qu'en mode démo ou en mode visualisation dans un testeur.

 

L'image est que ce n'est pas le bénéfice total qui est pris en compte, mais le bénéfice des différentes commandes.

 
Angela, le compilateur ne s'attendait pas à trouver ma définition de fonction à cet endroit précis. Cela signifie que quelque part plus haut dans le code, il manque quelque chose. Peut-être un point-virgule ou une accolade fermante. Quoi qu'il en soit, vérifiez attentivement le code.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY) ; // Appel de fonction

Passage incorrect des paramètres dans la fonction. Ça devrait être comme ça :

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

Passage incorrect des paramètres dans la fonction. Ça devrait être comme ça :

L'ajout d'une liaison au symbole dans l'appel de fonction n'aide pas. Pourquoi compte-t-il le bénéfice de chaque position séparément (image ci-dessus) ?