[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 1126

 
drknn:


Il codice è sbagliato. Innanzitutto, se la funzione start() è di tipo int, dovrebbe restituire un valore intero. Avete un ritorno restituito solo per condizione. E se la condizione non è soddisfatta, cosa dovrebbe restituire la funzione start() al terminale?

Inoltre, sei troppo complicato da controllare - meglio fare come segue: creiamo un contatore di ordini, aperti e chiusi oggi. Se il numero di ordini chiusi oggi è maggiore di zero, allora non si fa trading. Altrimenti, siamo autorizzati a commerciare.

cambiato int in void... non ha aiutato

Ad essere onesti, non capisco davvero come fare un contatore per gli ordini ed essere ancora in grado di abilitare/disabilitare l'opzione di trade giornaliero una tantum....

....pensiero-pensiero-pensiero proverò così

if(CalculateCurrentOrders(Symbol())==0 && Ordini==0)

{

CheckForOpen();

if(WaitForNewDay) {Ordini++;}

ritorno;

}

Azzeramento del contatore:

if(WaitForNewDay)CheckForNewDay();

void CheckForNewDay()

{

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

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

}

Comunque, sono tornato a quello da cui stavo scappando ))))

 
dzhini:

cambiato int in void... non ha aiutato

Onestamente, non capisco come fare un contatore di ordini ed essere ancora in grado di abilitare/disabilitare l'opzione di day trading una tantum....

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

Comunque, torniamo a quello da cui stavo scappando ))))

//+------------------------------------------------------------------+
//|                                                            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);     
}                  
//==================================================================================================
 
Per favore aiutatemi con il codice. Disegno e muovo manualmente una linea orizzontale e quando il prezzo la tocca, dovrebbe scattare un segnale.
 
Alexandr24:
Per favore aiutatemi con il codice. Disegno e muovo manualmente una linea orizzontale e quando il prezzo la tocca, si attiva un segnale.

Il prezzo tocca la linea - c'è un segnale. Lo capisco. Cosa c'è di sbagliato nel codice?
 
drknn:


Oggi sei tu il responsabile))) grazie. Mi informerò
 
Scusa, non ho impostato correttamente il compito)) Ho bisogno di un codice che faccia questo.
 
Alexandr24:
Scusa, ho impostato il compito in modo errato)). Ciò di cui avete bisogno è un codice che faccia questo.


La prima cosa da capire è che una linea è un oggetto. Il codice di programmazione distingue gli oggetti dai loro nomi. Hai bisogno di scrivere il nome della linea nel codice, e poi quando lasci la linea su un grafico, devi andare nelle sue proprietà e cambiare il nome con quello che hai scritto nel codice. Solo allora il codice capirà che è necessario elaborare le letture prese da questo oggetto.

Successivamente nel codice è necessario interrogare il prezzo in cui si trova la linea. La richiesta viene fatta tramite la funzione doppia ObjectGet(string name, int prop_id). Al posto di name dovete specificare il nome della vostra linea, e al posto di prop_id specificate OBJPROP_PRICE1. In questo modo puoi ottenere programmaticamente il prezzo al quale questa linea è impostata. Poi nel codice, dovete controllare se il prezzo tocca questa linea. Per esempio: se il prezzo del tick precedente è sotto il livello in cui è impostata la linea ed è più o uguale a questo livello nel tick attuale, allora questo tocco si è verificato.

Alexander, se non riesci a fare qualcosa con il codice, possono aiutarti qui. Se avete bisogno che il codice sia implementato per voi, andate su 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);
  }
Ho fatto questo, ma il segnale non funziona quando Close[0]==n. Come risolvere il problema? Le condizioni sono soddisfatte, ma per qualche motivo non funziona.
 
Alexandr24:
L'ho fatto ma il segnale non funziona quando Close[0]==n. Come risolvere il problema?


Beh, a giudicare dal codice, avete fatto un indicatore. Quindi, per controllare se questa parte del codice funziona, dovrete sedervi e aspettare che il prossimo tick tocchi la linea. È meglio creare uno script per testare questa parte del codice, perché vi darà risultati immediati.

La prima cosa di cui dovete assicurarvi è che il codice veda effettivamente la vostra linea. Come si fa? Devi chiedere il suo prezzo e mostrarlo come un avviso. Farlo.

//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+

Ora che lo script è stato ricompilato, apriamo qualsiasi grafico e disegniamo una linea orizzontale su di esso. Poi entriamo nelle sue proprietà e, dato che abbiamo dato il nome "1" alla linea nel codice, impostiamo anche questo nome nelle proprietà della linea:

Fare clic su OK. Lasciamo lo script sul grafico e ci assicuriamo che l'allarme abbia restituito il prezzo corretto. Spostiamo la linea nel grafico in un altro posto e di nuovo rilanciamo lo script al grafico e ci assicuriamo che se cambiamo la posizione della linea manualmente, il codice la vede e la riconosce ancora.

Procediamo nello stesso modo.

 

L'indicatore viene testato attraverso il tester con la visualizzazione accesa. Ho corretto un po' il codice, perché per far scattare l'allarme i valori dovrebbero essere normalizzati. Ma se si sposta la linea sulla barra corrente, diciamo un'ora, allora l'allarme sarà attivato solo 1 volta con il successivo movimento della linea sulla barra corrente di allarme per qualche motivo non funziona. Devo aspettare un altro 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);
  }
Motivazione: