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

 
Atlis:

Bon après-midi.

Veuillez indiquer comment mettre en œuvre ce qui suit :

Le prix évolue entre 1.9047 et 1.9080 (les chiffres sont arbitraires). Si le prix d'ouverture de la bougie suivante sort de cette fourchette, une alerte est émise. Si ce n'est pas le cas, attendez la prochaine bougie. Et ainsi de suite jusqu'à ce que le prix sorte de la fourchette.

Merci d'avance.


   if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
   if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
Ce n'est qu'un concept. Il y aura des alertes à chaque tick si la condition est remplie.
 

Voici un morceau de code, dont les données sont ensuite utilisées pour l'analyse :

   if (CurTime() == tm2)              //tm1 и tm2 - заданное время
   {
   //ObjectCreate("line2",OBJ_VLINE,0,tm1,0);
   price1=iHigh(Symbol(),PERIOD_M30,1);
   //ObjectCreate("highLine",OBJ_HLINE,0,0,price1);
   price2=iLow(Symbol(),PERIOD_M30,1);
   //ObjectCreate("lowLine",OBJ_HLINE,0,0,price2);
   Alert("price1=",price1);
   Alert("price2=",price2);
   }

c'est-à-dire que plus loin, le code ressemblera à ceci :

 if (Open[0]<price2) Alert("Цена ниже заданного диапазона");
 if (Open[0]>price1) Alert("Цена выше заданного диапазона");

Et voici la question : comment et où le mettre ? Si elle est à l'intérieur de la condition, aucune alerte ne sera imprimée, et si elle est à l'extérieur de la condition, les alertes seront imprimées à chaque tick.

Je m'excuse pour ma question mal formulée.

 
Atlis:

Voici un morceau de code, dont les données sont ensuite utilisées pour l'analyse :

c'est-à-dire que plus loin, le code ressemblera à ceci :

Et voici la question : comment et où le mettre ? Si elle est à l'intérieur de la condition, aucune alerte ne sera imprimée, et si elle est à l'extérieur de la condition, les alertes seront imprimées à chaque tick.

Je m'excuse pour ma question mal formulée.

Si vous placez la condition de contrôle du temps à l'intérieur, les alertes de prix n'apparaîtront que si le prix est en dehors des limites de la fourchette.
 
Merci, je crois que j'ai trouvé la solution. Mais encore une question : maintenant les alertes sont émises à partir d'un intervalle de temps donné et lors du dépassement de la plage jusqu'à "stop". Existe-t-il un moyen d'arrêter cette "recherche" lorsque la première valeur satisfait à la condition ?
 
Atlis:
Merci, j'ai réglé le problème. Voici une autre question : les alertes sont maintenant générées à partir d'un intervalle de temps spécifié et lorsque la plage est dépassée jusqu'au "stop". Existe-t-il un moyen d'arrêter cette "recherche" lorsque la première valeur satisfait à la condition ?

Eh bien, vous devez comprendre la condition principale qui est vraie tout le temps, sur une période de temps. Par exemple - une comparaison de temps. Après avoir émis toutes les alertes, vous devez attribuer une nouvelle valeur à la variable avec laquelle vous comparez l'heure actuelle. Recherchez une fonction qui définit une nouvelle barre. Le concept de sa construction devrait vous aider.

L'avez-vous lu ici?

 

Comment puis-je connaître la distance minimale du marché pour placer un ordre en suspens?

 
Elektronik:

Comment connaître la distance minimale du marché pour placer un ordre en attente ?

int level=MarketInfo(Symbol(), MODE_STOPLEVEL) ;

si le StopLevel est égal à zéro, alors le plus probable est que level=MarketInfo(Symbol(), MODE_SPREAD)*2 ;

Alpari utilise précisément le double écart comme niveau d'arrêt.

Pour déterminer la distance, lisez ici.

 

Merci artmedia70:

 
artmedia70:

OK, cela fait longtemps qu'il n'y a pas de réponse, je vais vous donner un conseil : lorsque la fonction isCloseLastPosByStop () renvoie la valeur vraie, elle renvoie une autre valeur, qui est la taille du lot de la dernière position trouvée.

Comment faire ? Passez une variable dans la fonction par référence, dans laquelle vous écrirez la taille du lot dans la fonction elle-même. Pour ce faire, vous devrez modifier légèrement la fonction isCloseLastPosByStop ()

Si vous ne comprenez rien, cherchez une fonction qui renvoie la taille du lot de la dernière position fermée. Ou vous pouvez en fabriquer un vous-même. Et l'utiliser, mais c'est plus coûteux que de passer la valeur du lot avec true.

J'ai modifié la fonction de sorte qu'au lieu de la fonction True, elle renvoie une variable lot, dans laquelle la fonction elle-même a écrit la taille du lot.

Tout se compile, mais les commandes ne s'ouvrent pas :

2013.10.23 20:57:46 2011.02.24 16:25 GMT EURUSD,M5 : Erreur OrderSend 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5 : montant des lots invalide pour la fonction OrderSend

if(isCloseLastPosByStop ()== lot )         //если последний ордер закрылся по стопу
{
P=lot*2;                                      //открыть ордер объемом = объему закрытому по стопу ордеру умноженному на 2                                  
OrderSend(Symbol(),OP_SELL,P,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else                                         //если последний ордер закрылся не по стопу
{

P=0.1;  
OrderSend(Symbol(),OP_SELL,1,Bid,P,Ask+1500*Point,Ask-300*Point,"jfh",123 );   //открыть ордер обычным объемом 0.1
}
   return(0);
  }
//============================================================  
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp,lot, osl;                                             // добавил переменную - количество лотов в оредере
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl)
    lot=OrderLots( ) ;                              //добавил вычисление количества лотов в ордере который закрылся по стопу.
    return(lot);                                    // вместо возвращаемого функцией значения True вставил переменную lot со значением количества лотов
  }
  return(False);
}

S'il vous plaît, dites-moi quelle est mon erreur.

Merci.

 
solnce600:

J'ai modifié la fonction pour qu'au lieu de True, elle renvoie une variable lot, dans laquelle j'ai écrit la taille du lot dans la fonction elle-même.

Tout se compile, mais les commandes ne sont pas ouvertes dans le journal dit :

2013.10.23 20:57:46 2011.02.24 16:25 PM EURUSD,M5 : Erreur OrderSend 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5 : montant des lots invalide pour la fonction OrderSend

Veuillez me dire quelle est mon erreur.

Merci.


La fonction déterminant la dernière position fermée par stop a un type bool, alors que vous essayez de retourner le type double. Par conséquent, il renvoie soit 0 soit 1.

J'ai écrit que nous devions y ajouter le passage d'une variable par référence :

//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      t, dg, i, j=-1, k=OrdersHistoryTotal()-1;

   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op           continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss()<0.5*pt)) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+

Maintenant, vérifiez le dernier Buy, par exemple :

//+----------------------------------------------------------------------------+
double Lot=MarketInfo(Symbol(), MODE_MINLOT);            // задаём минимальное значение переменной
if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot)) {// в переменную Lot будет записано значение лота закрытой позиции
   // Если последний закрытый Buy закрыт по стопу
   Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

Comme ça...

Raison: