Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 146

 

J'envoie généralement les commandes par des fonctions séparées. J'aimerais optimiser cette fonction, afin de pouvoir envoyer des ordres en attente et des ordres au marché avec une seule fonction.

Veuillez me conseiller sur la manière de l'implémenter correctement.

Lors de l'envoi d'ordres en attente, nous devons vérifier le prix d'ouverture au-dessus (au-dessous) du prix d'offre et prendre en considération certains autres aspects.

Voyons comment les autres s'y prennent. Prenons la variante la plus simple utilisée par Kim :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}

Il ne vérifie rien du tout. Nous pouvons voir que sa fonction est destinée uniquement à l'ouverture des ordres de marché.

Je ne pense pas que ce soit logique. Si vous envoyez une commande, elle sera de n'importe quel type. Si vous l'écrivez comme je le pense, il sera trop long, à première vue.

D'une manière générale, je demande de l'aide et des conseils sur la manière de mieux mettre en œuvre ces points.

 
hoz:

J'envoie généralement les commandes par des fonctions séparées. J'aimerais optimiser cette fonction, afin de pouvoir envoyer des ordres en attente et des ordres au marché avec une seule fonction.

Veuillez me conseiller sur la manière de l'implémenter correctement.

Lors de l'envoi d'ordres en attente, nous devons vérifier le prix d'ouverture au-dessus (au-dessous) du prix d'offre et prendre en considération certains autres aspects.

Voyons comment les autres s'y prennent. Prenons la variante la plus simple utilisée par Kim :

Il ne vérifie rien du tout. Nous pouvons voir que sa fonction est destinée uniquement à l'ouverture des ordres de marché.

Je ne pense pas que ce soit logique. Si vous envoyez une commande, elle sera de n'importe quel type. Si vous l'écrivez comme je le pense, il sera trop long, à première vue.

D'une manière générale, permettez-moi de demander de l'aide et des conseils sur la manière de mieux mettre en œuvre ces points.

Eh bien, la fonction d'Igor exécute la tâche même indiquée dans le nom de la fonction. Tous les réglages et contrôles doivent être effectués AVANT d'appeler cette fonction. Après tout, la fonction elle-même ne fait que la tâche qui lui est assignée - elle ouvre la position avec les paramètres qui lui sont passés (dans la fonction) et rien de plus. Il le fait parfaitement bien et gère toutes les erreurs nécessaires. Ce qui manque - développez-le vous-même.

Par analogie : lorsque vous achetez du café instantané dans un magasin, l'eau bouillante, le sucre et le mélange automatique d'autres ingrédients ne lui sont pas proposés - il vaut mieux savoir comment faire son propre café.

 

Les amis, est-il possible de... S'il vous plaît réécrivez sous une condition de boucle différente...

C'est-à-dire qu'il existe un merveilleux indicateur bbands_stop :


for (shift=Nbars-Length-1;shift>=0;shift--)

{

smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);

smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);

if (Close[shift]>smax[shift+1]) trend=1;

if (Close[shift]<smin[shift+1]) trend=-1;


bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

if (trend>0)

UpTrendBuffer[shift]=bsmin[shift];

else

DownTrendBuffer[shift]=bsmax[shift];

}

Est-il possible d'écrire un code similaire aux résultats du précédent. Mais pour une boucle :

for(i = 0; i <= limit; i++) {

C'est le deuxième jour que je suis assis ici ; je ne peux pas le trouver...

 
Bonjour à tous, bien sûr la question est stupide, quelle est la taille de lot nécessaire pour que 1 pip vaille 1 dollar ?
 
0.1
 
FEAR:
Bonjour à tous, bien sûr la question est stupide, quelle est la taille de lot nécessaire pour que 1 pip vaille 1 dollar ?
Cela dépend de la taille du terrain.
 
nikelodeon:
0.1
pas toujours
 
PapaYozh:
pas toujours
Selon l'épaule....
 
0,1 à l'effet de levier 1:100
 
nikelodeon:
Selon l'épaule....

nikelodeon:
0,1 avec un effet de levier de 1:100

Les épaules ne sont pas pertinentes lorsqu'il s'agit du style d'un article.

Raison: