E facciamone un "cartone animato" (multicurrency) - pagina 2

 

Potete modificare leggermente la mia funzione per restituire il numero totale di ordini per un dato strumento e mago.

 
ALex2008 писал(а) >>

Se non sapete cosa farne, potete chiedere aiuto. L'essenza di una cosa - farlo funzionare su diverse coppie, non su una) E testarlo su una demo non è un problema, solo un mese o due, ma il risultato è interessante)

Formulate la logica del multiforme Expert Advisor, più è dettagliata meglio è, e forse non avrete bisogno di aiuto.

Come regola la chiara comprensione del compito è il 90% del suo successo.

 
sergeev >> :

E comunque, hai degli errori nel tuo codice, molti!

iLow(PERIOD_H4,0,0) - cos'è questo?

Basso della candela corrente))

Infatti...! Come funziona allora nel test?

Non capisco come ho fatto a ridurmi così. Dovrebbe essere iLow(NULL,PERIOD_H4,0)

 
xeon >> :

Formulate la logica dell'esperto multivalente, più è dettagliata meglio è, e potreste non aver bisogno di altro aiuto.

Come regola, una chiara comprensione del compito è il 90% del suo successo.

Non c'è niente di sbagliato nella logica) è solo che non ho esperienza. Capisco che avete bisogno di tracciare gli ordini in base a qualsiasi attributo, ma dato che non ho mai scritto niente del genere prima d'ora, ho paura che ci sarà solo una domanda... sulle funzioni e la loro implementazione)

 
ALex2008 писал(а) >>

Non c'è niente di sbagliato nella logica) Sono solo inesperto... Capisco la necessità di tracciare gli ordini in base a qualsiasi attributo, ma siccome non ho mai scritto niente del genere prima d'ora, ho paura che ci sarà solo una domanda... sulle funzioni e la loro implementazione)

Guarda la pagina precedente per la funzione

 
Vinin >> :

Vedere la funzione nella pagina precedente

Grazie) Cercherò di metterlo nel codice)

Ha iniziato a scrivere...

#define MAGIC 7779

invece di questo -

   if(OrdersTotal()==0){
      mod=false;
      SetOrders();}

scrivendo questo -

   if( Order_Count_Calculate(Symbol(), MAGIC)==0){
      mod=false;
      SetOrders();}

... fallisce - 'Order_Count_Calculate' - la funzione non restituisce alcun risultato

Se ho capito bene, la funzione dovrebbe trovare tutti gli ordini del simbolo corrente Symbol() con un MAGIC
 
ALex2008 писал(а) >>

Grazie) Cercherò di metterlo nel codice)

Ha iniziato a scrivere...

Questo è esattamente ciò che non volete extern string _Symbol = Symbol();

Anche se una variabile può essere definita, ed è meglio assegnare un valore in inite() o start()

 
Sono inciampato alla prima funzione...( Ho capito il punto, ma non so come usarla correttamente...
 
ALex2008 писал(а) >>

Non c'è niente di sbagliato nella logica) Sono solo inesperto... Capisco la necessità di tracciare gli ordini in base a qualsiasi attributo, ma siccome non ho mai scritto niente del genere temo che ci sarà solo una domanda... sulle funzioni e la loro implementazione)

Eh.... Temo che tu non capisca..............

il compito - "voglio che voli", non è la logica - cosa ha volato dove ha volato ecc. ecc.

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

Un breve esempio del compito:

Uso simultaneo di EURUSD, GBPUSD, USDCHF, USDJPY.

Periodo H1.

......................

condizione di selezione della coppia di valute

COMPRARE condizione

Condizione di impostazione SELL

.......................

Ecco un breve esempio di implementazione:

int MAGIC = 322223;
string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать
int start(){
   
   int s = SymbolSelect();                   //Функция выбора валютной пары
   if( SelectOrder( Sym[ s],OP_BUY, MAGIC)<0){   //Если нет установленного ордера по выбранному символу
      UpTrend( Sym[ s]);                       //Проверим условие установки ордера 
   }
   if( SelectOrder( Sym[ s],OP_SELL, MAGIC)<0){  //Если нет установленного ордера по выбранному символу
      DownTrend( Sym[ s]);                     //Проверим условие установки ордера 
   }

}


int SymbolSelect(){
  int s=-1;
  //Условие выбора валютной пары для работы  
   
  return( s)
}
    //+-------------------Выбор ордера---------------------------+
int SelectOrder(string Sym,int Tip,int MAGIC){
    int TotOrd=OrdersTotal();
    int OrdTick=-1;
    for(int OrdPos= TotOrd-1; OrdPos>=0; OrdPos--){
        if(OrderSelect( OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
           if(OrderSymbol()== Sym){                                           //Есть ли ордера с нужным символом
              if(OrderType()== Tip){                                          //Если нужный тип ордера  
                 if( MAGIC==0){ MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                 if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                    OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
    }}}}}
    return( OrdTick);                                                         //Возвращает тикет найденного ордера или -1
}
bool UpTrend(string Sym){
     //Условие установки BUY ордера
}
bool DownTrend(string Sym){
    //Условие установки SELL ордера
}

ecc.

Dico sul serio, se pensate alla logica in dettaglio, non avrete problemi con l'implementazione.

 
xeon >> :

...Voglio dire, se pensate alla logica in dettaglio, non avrete problemi di implementazione.

Ci penserò oggi... Sento di aver trovato un mal di testa)) Grazie.

Comunque, ecco una bozza con degli errori... >> correggetemi).

extern double Profit = 3000;

int MAGIC = 322223;

string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать

double b0, b1, s0, s1, StopLoss, Enter;
bool dwnSym, upSym, mod;

int init(){ Profit*=Point;
}

int start()
{
   
      int s = SymbolSelect();                      //Функция выбора валютной пары
      if( SelectOrder( Sym[ s],OP_BUYSTOP, MAGIC)<0){  //Если нет установленного ордера по выбранному символу
         UpTrend( Sym[ s]);                          //Проверим условие установки ордера 
         }
      if( SelectOrder( Sym[ s],OP_SELLSTOP, MAGIC)<0){ //Если нет установленного ордера по выбранному символу
         DownTrend( Sym[ s]);                        //Проверим условие установки ордера 
         }
      
      
      if( SelectOrder( Sym[ s],OP_BUYSTOP, MAGIC)>0 && AccountProfit()&& (! mod)){  //Если установлен ордер по выбранному символу
         SetStopBuy( Sym[ s]);                                                  //и он открылся, ставим стоп
         }
      if( SelectOrder( Sym[ s],OP_SELLSTOP, MAGIC)>0 && AccountProfit()&& (! mod)){ //Если установлен ордер по выбранному символу
         SetStopSell( Sym[ s]);                                                 //и он открылся, ставим стоп
         }
}

   int SymbolSelect(){
   int s=-1;
   return( s);}
   
//+-------------------Выбор ордера---------------------------+
   int SelectOrder(string Sym,int Tip,int MAGIC){
      int TotOrd=OrdersTotal();
      int OrdTick=-1;
      for(int OrdPos= TotOrd-1; OrdPos>=0; OrdPos--){
         if(OrderSelect( OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
            if(OrderSymbol()== Sym){                                           //Есть ли ордера с нужным символом
               if(OrderType()== Tip){                                          //Если нужный тип ордера  
                  if( MAGIC==0){ MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                  if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                     OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
      }}}}}
    return( OrdTick);}                                                         //Возвращает тикет найденного ордера или -1


//Условие и установка BUY ордера
   bool UpTrend(string Sym){
       
       if((iOpen( Sym,PERIOD_H4,1) - iClose( Sym,PERIOD_H4,1) <= 0) &&
         (iOpen( Sym,PERIOD_H4,2) - iClose( Sym,PERIOD_H4,2) > 0)){
          upSym=false;
          dwnSym=true;
          CloseOpenOrdersAndCancelPending();
          double Enter=iHigh( Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
          OrderSend( Sym, OP_BUYSTOP, 0.1, Enter, 0, 0, Ask+ Profit, 0, 0,0, Green);}
   }

//Условие и установка SELL ордера
   bool DownTrend(string Sym){
       
       if((iOpen( Sym,PERIOD_H4,1) - iClose( Sym,PERIOD_H4,1) >= 0) &&
         (iOpen( Sym,PERIOD_H4,2) - iClose( Sym,PERIOD_H4,2) < 0)){
          upSym=true;
          dwnSym=false;
          CloseOpenOrdersAndCancelPending();
          double Enter=iLow( Sym,PERIOD_H4,1)-10*Point;
          OrderSend( Sym, OP_SELLSTOP, 0.1, Enter, 0, 0, Bid- Profit, 0, 0,0, Green);}
         
   }
   
//-------Вычисление и утановка стопа для бай
void SetStopBuy(string Sym)
   {
      RefreshRates();
      double b0=iLow( Sym,PERIOD_H4,0)-10*Point;
      double b1=iLow( Sym,PERIOD_H4,1)-10*Point;
      
            if( b0< b1) StopLoss= b1;
            else StopLoss= b0;
            RefreshRates();
            mod=OrderModify( OrdTick,OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
   } 
   
 //-------Вычисление и утановка стопа для сел
void SetStopSell(string Sym)
   {
      RefreshRates();
      double s0=iHigh( Sym,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      double s1=iHigh( Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      
            if( s0< s1) StopLoss= s0;
            else StopLoss= s1;
            RefreshRates();
            mod=OrderModify( OrdTick,OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
   }
   
void CloseOpenOrdersAndCancelPending()
   {
      for (int i=OrdersTotal()-1; i>=0; i--){
      if (!OrderSelect( i, SELECT_BY_POS))  continue;
      if (OrderSymbol()!= Sym)        continue;
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10);}
   }
Motivazione: