Fonctions utiles de KimIV - page 92

 
alexpert007 >> :

Et voici une autre question pour Igor.

Avez-vous créé une fonction personnalisée distincte (ou autre) pour inverser la position d'achat et de vente et vice versa, sans l'habituel OrderClose - OrderSend ?

Je ne suis pas Igor, mais il existe une fonction standard OrderCloseBy pour le flipping.

 

Bonjour, j'ai besoin d'aide pour résoudre un problème. Je vais essayer de le décrire :

Il existe une fonction qui compte les commandes :

int OrdersAll(int mag)
{
int kolvo=0 ;
for (int i=OrdersTotal()-1 ; i>=0 ; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++ ;
}
}
return(kolvo) ;
}

En outre, au cours du processus, s'il n'y a pas d'ordre pour le symbole actuel, lorsque la condition est remplie, un ordre, par exemple d'achat, doit être placé :

if(OrdersAll(MAGICNO)==0)
{
if(condition)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits), "",MAGICNO,0,Blue) ;
if(err<0)
{
Print("OrderSend()- Error OP_BUY. La commande n'est pas acceptée. op "+op+" sl "+sl+" tp "+tp+""+GetLastError());return(-1) ;
}
}
}

Au lieu de cela, lorsque vous ouvrez plusieurs symboles dans le terminal et exécutez un EA dans chacun d'eux, par exemple, le code ci-dessus peut ouvrir un ordre - c'est correct, mais en même temps il peut ouvrir 20-30 ordres jusqu'à ce que le morse s'épuise, si la condition tient pendant plusieurs ticks. Je n'ai pas encore vu cela se produire sur un seul instrument, mais je ne suis pas du tout sûr que cela ne se produira pas non plus sur un seul instrument. Comment puis-je corriger mon code pour qu'il soit difficile de ne pas ouvrir plus d'une commande.

 

Igor, bonsoir,

Je ne peux pas gérer votre appel de fonction :

//+----------------------------------------------------------------------------+
//| Auteur : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Version : 19.02.2008 |
//| Description : Retourne le profit total des positions ouvertes dans la devise de dépôt.
//+----------------------------------------------------------------------------+
//| Paramètres : |
//| sy - nom de l'instrument (" - n'importe quel symbole, |
//| NULL - symbole actuel) |
| //| op - opération (-1 - toute position) |
//| mn - MagicNumber (-1 - n'importe quel magik) |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p=0 ;
int i, k=OrdersTotal() ;

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

Pouvez-vous me dire, dans l'appel TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1) ;

1. Supposons qu'il s'agisse de l'EURUSD, doit-il être entre guillemets "EURUSD" ou est-il autorisé sans ;

2. Quel doit être le deuxième paramètre d'appel (où se trouve un tiret) pour calculer le profit total d'achat et de vente (j'ai essayé la valeur par défaut -1 ; ce n'est pas correct).

3. le troisième paramètre est le nombre magique de l'Expert Advisor ? - Je n'y suis pas encore arrivé, je me demande simplement si je comprends bien le paramètre.

Merci.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1) ;

- seulement pour EURUSD

- tous les postes ouverts (-1)

- positions avec n'importe quel magik (-1)

 

Bon après-midi.

Comme vous le savez, Sleep() ne fonctionne pas dans le testeur de terminal, vous devez donc utiliser des boucles de fonctions mathématiques pour retarder l'exécution :

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

où zFILE est le délai d'exécution de l'Expert Advisor.

Ma question est la suivante : existe-t-il une solution plus sophistiquée, car j'ai besoin d'un délai de quelques secondes à 10-20 minutes (traitement des données par un programme externe) ?

Ou au moins comment mesurer le temps d'exécution avec plus de précision (car les performances des processeurs sont différentes) et choisir le plus lent ?





 
Piboli >> :

Question : existe-t-il une solution plus élégante (fonction de retardement), car le retardement est nécessaire de quelques secondes à 10-20 minutes (traitement des données par un logiciel externe) ?

Vous n'avez pas essayé d'utiliser les callbacks et les synchroniseurs ?

 

Les fonctions de Kim

Je me demande s'il y a une fonction qui vous permet d'extraire le nom du dernier modèle.

et enregistrer les changements dans ses composants


 

KimIV peut-être que vous pouvez et écrire un indicateur

L'indicateur doit rechercher un canal plat dans une période de temps donnée et pas plus large que ce qui est spécifié dans les paramètres.

Cet indicateur doit rechercher le canal à la fois dans un jour et le jour suivant comme dans votre fonction isTradeTimeInt().
Cet indicateur peut tirer 5 canaux pendant une journée ou un seul.
Dans les paramètres

extern double la hauteur maximale du canal en points
extern int Bar_Time comment on calcule l'intervalle de temps en barres (1) ou en heures et minutes (2)
extern string intervalle de temps minimum du canal en heures et minutes
extern int int intervalle de temps minimum du canal en bars
extern int nombre maximum de canaux tirés qui restent tirés

Je joins un indicateur similaire à https://www.mql5.com/ru/code mais il dessine le canal dans un intervalle de temps strictement défini et ne cherche pas un tel canal par lui-même. Il doit uniquement rechercher un canal qui ne dépasse pas la hauteur maximale du canal et qui n'est pas plus court que l'intervalle de temps minimal du canal.
Si nous choisissons Bar_Time pour l'heure du canal, le canal(1) est calculé à partir de l'heure actuelle moins l'heure donnée dans les paramètres, c'est-à-dire 2 heures 15 minutes ou une autre heure donnée. Si nous sommes maintenant à 1 heure 15 minutes, il cherche les max et min de 23 heures 00 minutes et si le max moins le min est inférieur à la hauteur maximale du canal, il dessine deux lignes max et min de 23:00 à 02:15. Il trace également des niveaux de Fibo au-dessus et en dessous du canal.

Si nous choisissons Bar_Time par nombre de barres, le canal est calculé à partir de la barre actuelle moins le nombre de barres spécifié dans les paramètres, c'est-à-dire de la barre zéro à la barre zéro moins le nombre spécifié dans les paramètres. Si le nombre choisi est 50, nous chercherons le haut et le bas des 50 dernières barres à partir de la barre zéro et si le haut moins le bas n'est pas supérieur à la hauteur maximale du canal, deux lignes de haut et bas de 50 barres seront dessinées.

Tous les niveaux et les données des canaux sont stockés dans des tampons.

 

Question à Igor

Si vous pouvez me donner un fragment de code d'un conseiller expert pour deux comptes séparés (achat-vente) qui interroge chaque compte (pour le calcul de la taille du lot) et peut transférer un dépôt d'un compte à l'autre et en retirer une partie selon certaines conditions (par exemple, le bénéfice mensuel ou trimestriel - n% de celui-ci).

Permettez-moi de clarifier ma question

1 Le conseiller expert travaille sur l'achat (sondage de l'état du compte 2). 6200

2 Le conseiller expert ouvre une position de vente (demande le solde du compte à 1) ... 8400

S'il n'y a pas de postes ouverts

1100 du compte 2 au compte 1

compte 1 - 7300

compte 2 - 7300

Dépôt brut total SD=14600 Risque maximum - 10% Lot maximum 0.14

Plus d'informations sur

à partir du 01.04.09 SD=10000

à partir du 01.07.09 SD=14600

Bénéfice = 4600

10% = 460

460 déduits sur le troisième compte

Merci.

 

Cher Igor, aide-moi !

J'ai connecté a-SimpleTrailing.mqh.

J'aiajouté ce qui était spécifié, mais 3 erreurs sont apparues:

clModifyBuy" - variable non définie
"clModifySell" - variable non définie
"ti" - variable déjà définie

Que faire ?(



Voici ce qui convient :

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if ( pp!= op || sl!= os || tp!= ot) {
    for ( it=1; it<= NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if ( fm) {
        if ( UseSound) PlaySound( NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(", er,") modifying order: ", ErrorDescription( er),", try ", it);
        Print("Ask=", pa,"  Bid=", pb,"  sy=",OrderSymbol(),
              "  op="+ GetNameOP(OrderType()),"  pp=", pp,"  sl=", sl,"  tp=", tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+
Raison: