[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 1126

 
drknn:


Le code est faux. Premièrement, si la fonction start() est de type int, elle doit renvoyer une valeur entière. Vous avez un retour uniquement par condition. Et si la condition n'est pas remplie, que doit renvoyer la fonction start() au terminal ?

De plus, vous êtes trop compliqué à vérifier - mieux vaut faire comme suit : nous créons un compteur d'ordres, ouverts et fermés aujourd'hui. Si le nombre d'ordres clôturés aujourd'hui est supérieur à zéro, alors vous ne négociez pas. Sinon, nous sommes autorisés à faire du commerce.

changé int en void... n'a pas aidé

Pour être honnête, je ne comprends pas vraiment comment faire un compteur pour les ordres tout en étant capable d'activer/désactiver l'option de transaction quotidienne unique.....

....think-think-think Je vais essayer comme ceci

si(CalculateCurrentOrders(Symbol())==0 && Orders==0)

{

CheckForOpen() ;

if(WaitForNewDay) {Orders++;}

retour ;

}

Remise à zéro du compteur :

if(WaitForNewDay)CheckForNewDay() ;

void CheckForNewDay()

{

tm=iTime(Symbol(),PERIOD_D1,0) ;

if (bt!=tm) {bt=tm ; Orders=0;}

}

Bref, j'en reviens à ce que je fuyais. ))))

 
dzhini:

changé int en void... n'a pas aidé

Honnêtement, je ne comprends pas comment faire un compteur d'ordres tout en étant capable d'activer/désactiver l'option unique de trading journalier.....

-------------

Quoi qu'il en soit, revenons à ce que je fuyais. ))))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
Veuillez m'aider avec le code. Je dessine et déplace manuellement une ligne horizontale et lorsque le prix la touche, cela devrait déclencher un signal.
 
Alexandr24:
Veuillez m'aider avec le code. Je dessine et déplace manuellement une ligne horizontale et lorsque le prix la touche, cela déclenche un signal.

Le prix touche la ligne - il y a un signal. Je le comprends. Quel est le problème avec le code ?
 
drknn:


C'est vous qui êtes en charge aujourd'hui. Merci. Je vais m'en occuper.
 
Désolé, je n'ai pas défini la tâche correctement ;)) J'ai besoin d'un code qui fasse cela.
 
Alexandr24:
Désolé, j'ai mal défini la tâche)). Ce dont vous avez besoin, c'est d'un code qui fasse cela.


La première chose à comprendre est qu'une ligne est un objet. Le code de programmation distingue les objets par leur nom. Vous devez écrire le nom de la ligne dans le code, puis lorsque vous déposez la ligne sur un graphique, vous devez aller dans ses propriétés et changer le nom pour celui que vous avez écrit dans le code. Ce n'est qu'alors que le code comprendra que vous devez traiter les relevés effectués sur cet objet.

Ensuite, dans le code, vous devez demander le prix où se trouve la ligne. La demande est effectuée via la double fonction ObjectGet(string name, int prop_id). Au lieu de name, vous devez spécifier le nom de votre ligne, et au lieu de prop_id, spécifiez OBJPROP_PRICE1. De cette façon, vous pouvez obtenir de manière programmatique le prix auquel cette ligne est fixée. Ensuite, dans le code, vous devez vérifier si le prix touche cette ligne. Par exemple : si le prix du tick précédent est inférieur au niveau où la ligne est fixée et qu'il est supérieur ou égal à ce niveau sur le tick actuel, alors ce toucher a eu lieu.

Alexander, si vous ne parvenez pas à faire quelque chose avec le code, ils peuvent vous aider. Si vous souhaitez que le code soit implémenté pour vous, veuillez vous rendre sur le site https://www.mql5.com/ru/job.

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
J'ai fait cela, mais le signal ne fonctionne pas lorsque Close[0]==n. Comment le réparer ? Les conditions sont remplies, mais pour une raison quelconque, cela ne fonctionne pas.
 
Alexandr24:
Je l'ai fait mais le signal ne fonctionne pas lorsque Close[0]==n. Comment le réparer ?


Eh bien, à en juger par le code, vous avez fait un indicateur. Ainsi, pour vérifier si cette partie du code fonctionne, vous devrez vous asseoir et attendre que le prochain tick touche la ligne. Il est préférable de créer un script pour tester cette partie du code, car il vous donnera des résultats instantanés.

La première chose dont vous devez vous assurer est que le code voit effectivement votre ligne. Comment faites-vous ? Vous devez demander son prix et l'afficher comme une alerte. Je le fais.

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

Maintenant que le script a été recompilé, nous ouvrons n'importe quel graphique et y dessinons une ligne horizontale. Ensuite, nous entrons dans ses propriétés et, puisque nous avons donné le nom "1" à la ligne dans le code, nous définissons ce nom dans les propriétés de la ligne également :

Cliquez sur OK. Nous déposons le script sur le graphique et nous nous assurons que l'alerte a renvoyé le bon prix. Nous déplaçons la ligne du graphique à un autre endroit et renvoyons le script au graphique pour nous assurer que si nous changeons la position de la ligne manuellement, le code la voit et la reconnaît toujours.

Puis on continue dans la même veine.

 

L'indicateur est testé par le testeur avec la visualisation activée. J'ai corrigé un peu le code, car pour que l'alerte soit déclenchée, les valeurs doivent être normalisées. Mais si vous déplacez la ligne sur la barre actuelle, disons une heure, alors l'alerte ne sera déclenchée qu'une seule fois avec le mouvement ultérieur de la ligne sur l'alerte de la barre actuelle pour une raison quelconque, cela ne fonctionne pas. Je dois attendre un autre bar.

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
Raison: