[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 509

 

edyuson:
Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.

sergeev:

faire un compteur int et ajouter +1 à chaque ouverture.

Une fois que la valeur correcte du compteur est définie, permettez de faire le lot*koef également.


Oui, ce n'est pas aussi facile que je le pensais, maintenant ça commence à se produire. Et le cycle : lot-0.01, lot-0.01, lot-0.01 et seulement après avoir multiplié lot-0.02, lot-0.02, lot-0.02 encore : lot-0.04, lot-0.04, lot-0.04 .... doit être interrompue par le profit et se poursuivre par des lots. Les gars de l'autre forum ont présenté quelques variantes à ce sujet : Vous pourriez déclarer le double koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1 . 0, 1.0, 2.0 .......} - comme un tableau, en le remplissant avec les coefficients requis, et une variable statique ou globale int k=0 ;
Alors lot=lot*koef[k++] ; Série de départ : k=0 ;

et ainsi de suite :
int k = 1 ;
int koef = 3 ;
if (k/koef == k) { lot*=2 ; k++ ; } mais tout est faux.

J'ai essayé un compteur comme : int j ;
for(j=0 ; j<15 ; j++)
, mais encore une fois ce n'est pas la même chose. Voici tout :
int X=0 ;
double S = 0.0000 ;
extern double lot=0.01 ;
extern double koef=2.0 ;
extern int SL=30 ;
extern int TP=120 ;
double dl ;
double a ;
int init()
{
a=lot ;
return(0) ;
}
int deinit()
{
return(0) ;
}

int start()

{
if(OrdersTotal() == 0 && X==1)
{
if (Close[0]>dl){lot=a;}
X=0 ;
}

if(OrdersTotal() == 0 && X==2)
{
if (Close[0]<dl){lot=a;}
X=0 ;
}


si (OrdersTotal() == 0 && Close[1]>Open[1])
{
dl=Close[0] ;
OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-SL*0.0001,Ask+TP*0.0001,",14774,0,Blue) ;
//--------------------------------------------------------------------

lot=lot*koef ;
X=1 ;
}

if(OrdersTotal() == 0 && Close[1]<Open[1])
{
dl=Close[0] ;
OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+SL*0.0001,Bid-TP*0.0001,",14774,0,Red) ;
//sudy some haler may help
lot=lot*koef ;

X=2 ;
}
}
return(0) ;
//C'est juste un martin

 

Merci, mais regardez, il y a deux prix, l'un est le prix d'ouverture de l'ordre, et l'autre est le prix du stop loss, le nombre de points du stop loss et le prix du point sont connus. Comment calculer la taille du lot pour que la perte soit de 10 % du dépôt si le prix atteint le stop loss ? Je ne suis pas doué pour les chiffres.

Je ne comprends pas non plus

Pour les taux croisés, la valeur du point, exprimée en dollars, est calculée par la formule
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
où LOT_SIZE est la taille du lot, TICK_SIZE est la taille du tick, BASE_QUOTE est la cotation actuelle de la devise de base (première) par rapport au dollar US, CURRENT_QUOTE est le taux actuel de la paire.

Comment comprendre cette première monnaie par rapport au dollar américain ?

 

Oui... serré... :-)

la (première) devise de base par rapport au dollar américain, soit, dans l'exemple GBP/JPY - GBP/JPY,GBP/USD.

J'ai refait ce script, qui est ce dont vous avez besoin avec le calcul du volume de la position négociée, en fonction du montant du capital et de la taille du stop loss.

Vous en avez également besoin - "J'ai été confronté à un problème et je me débats depuis trois jours déjà sans pouvoir le résoudre. Dans l'Expert Advisor terminé j'ai décidé au lieu d'un lot d'entrer le % de risque, donc j'ai besoin de calculer le lot à arrêter, par exemple à 10 000 dépo le risque de 1% à un arrêt de 100 points il sera d'environ 0,1 lot et ici à 200 lot arrêt le lot devrait être 0,05, donc le risque de 1% est resté au même niveau. J'espère que tout est clair. Et vous voilà en train d'écrire :

"Comment calculer la taille du lot pour que la perte soit égale à 10 % du dépôt, par exemple, si le prix atteint le stop loss ? Je ne suis pas doué avec les chiffres. "

J'ai donc modifié la fonction de calcul du lot du tutoriel - sa description et son approche sont les mêmes, mais au lieu de calculer le lot en pourcentage de la taille du dépôt, le lot négocié est calculé en fonction de vos conditions (données par moi dans cet exemple - voir le script ci-dessus) :

extern string A0 = "Параметры ММ и мониторинга";
extern double Lots = 0;           // Стартовый лот = 0 для использования максимального риска на капитал в процентах, в зависимости от величины стоп-лосса
extern int StopLoss = 1000;
extern int TakeProfit =4000;      // TakeProfit для новых ордеров (пунктов)
extern  double MaxRisk = 10;      // риск на капитал в %
                                  // рассчитываем объем позиции взависимости от размера стопа, при заданном риске
                                  // например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1,
                                  // при стопе 200 пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне

int start()
{    
   //----------------------------------СТАРТ------------------------------------------------------------------------------------- 
 
// ...  

//----------------------------------Расчет объема лота------------------------------------------------------------------------ 
  if (Lot(StopLoss)==false)  
                        {
                          Comment(" Пополните счет. Не хватает средств на минимальный лот. Советник остановлен.");// Если средств не хватает на мин, то выход
                          Print  ("Не хватает средств на минимальный лот. Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin()); 
                                                                                                   // Если средств не хватает на мин, то выход
                          return (0);
                        }  
// ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...                          
   Lots_New = NormalizeLots(Lots_New);      

//... здесь условия на открытие поз и установка ордеров

}//------------------------------------------Конец Старт-----------------------------------------------------

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}

//--------------------------------------------------------------------
// Lot.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot(int sl)                               // Позовательская ф-ия
  {
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots > 0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots_New=Lots;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
//--------------------------------------------------------------- 4 --
  else                                        // Если лоты не заданы
     {                                         // то берём процент 
                                               // Желаем. колич.лотов:
                                               
      Lots_New =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step;
      if(Lots_New<Min_Lot) Lots_New=Min_Lot;
      if(Lots_New>Max_Lot) Lots_New=Max_Lot;
      Print ("Lot_New в ф-ии Lots = ",Lots_New, "ширина канала = ",sl, "Point  = ",Point);
     }
//--------------------------------------------------------------- 5 --
   if (Lots_New < Min_Lot)                     // Если меньше допуст..
      Lots_New=Min_Lot;                        // .. то миниамальный
   if (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
      Print ("Не хватает средств на минимальный лот.  Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin());  // Сообщение..
      return(false);                           // ..и выход 
     }
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --
 
Reshetov:
static int Kvadrat = 0;



J'ai essayé cette méthode. Maintenant, pendant toute la période de test, un ordre STOPLOSS en attente s'est ouvert et c'est tout... peut-être mon terminal est-il défaillant ?

Le programme est censé trouver les prix maximum et minimum chaque jour, de 7 à 9 heures, et placer un ordre stop à ces niveaux.

Dossiers :
 
mamba5:


J'ai essayé cette méthode. Maintenant, pendant toute la période de test, un ordre STOPLOSS en attente s'est ouvert et c'est tout... peut-être mon terminal est-il défaillant ?

Avez-vous des difficultés à regarder dans le journal pour voir ce qui pose problème ?
 

Bonjour.

Quelqu'un a-t-il eu des problèmes avec la fonction

IsDemo()

?

Je n'obtiens toujours qu'un seul résultat - que le compte est réel (qu'il soit réel ou démo).

 
nemo811:

Bonjour.

Quelqu'un a-t-il eu des problèmes avec la fonction

?

J'obtiens toujours un seul résultat : mon compte est réel (qu'il soit réel ou démo).

J'ai mis un EA sur un graphique avec un code sur un compte de démonstration:

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
Ecrit dans le magazine : "C'est une démo.
 
Reshetov:

J'ai un compte de démonstration avec un EA avec un code sur le graphique :

Il écrit dans le journal : "C'est une démo.

J'ai une démo sur un phibogroupe - pour une raison mystérieuse, il dit que je suis sur un compte réel. Dans votre version, il est indiqué - Ceci n'est pas une démo.

Il s'avère que d'une certaine manière le DC lui-même est perverti.

 
nemo811:

J'ai une démo sur phibogroup - pour une raison mystérieuse, il est dit que je suis sur real. Dans votre version de l'image - Ce n'est pas une démo.

Il s'avère que d'une certaine manière, le DC lui-même est devenu pervers.

Certains courtiers fournissent un seul serveur pour la démo et pour le réel. Vérifiez auprès de l'assistance du courtier.
 
Reshetov:
Certains courtiers ont un seul serveur pour la démo et le réel. Vérifiez auprès du service d'assistance de votre courtier.

Merci.

Raison: