Uma pergunta para os especialistas em MQL - página 8

 
Rita:
Obrigado, abolk, pelo esclarecimento.


Parece que várias funções precisam ser combinadas em uma só. A lógica é a mesma em todos os lugares

 

-Bom tarde.

Em nosso antigo Expert Advisor, utilizamos esta abertura de posições (função de I. Kim):

if (NumberOfPositions(NULL,OP_BUY,Magic1)<1 ) {//если нет откр. позиций
  ti=OpenPosition(NULL,OP_BUY, Lots,0 ,0,Magic1);
                                              } 
} }//если условия соответствуют заданным      

Agora estou escrevendo outro EA e estou copiando este pedaço de código

e de repente recebo a seguinte mensagem quando tento compilá-la

Não consigo entender por que recebo erros! O código é estritamente equilibrado.

E mais! Quando removo o parâmetro ti(que é declarado nas variáveis globais), os erros de compilação desaparecem:

 if (NumberOfPositions(Symbol_1,-1, MagicNumber) ==1  && 
     NumberOfPositions(Symbol_2,-1, MagicNumber) <1 ) {
//если есть открытая позиция 1 символа, - открываем позицию второго символа: 
//ti=
  OpenPosition(Symbol_2,Positions_Symbol_2, Lots_1,0 ,0,MagicNumber);
                                                          }

 //if ( ti>0 )  
 //MessageBox("Позиции открыты! Не забудьте отключить Start_Trade",0,1 );

Mas eu preciso exatamente com um bilhete (ti), a fim de realizar a execução da MessageBox posteriormente.

Não consigo entender desde esta manhã. Por favor, informe o que é uma imprecisão aqui?

Por que de repente eu recebo erros ao adicionar ti= antes do OpenPosition( - por quê?


 

OpenPosition() deve ser declarado como nulo e deve ser int.

int OpenPosition(....){

....

}
 

Obrigado, Integer!

Sim, - foi exatamente isso que aconteceu! Agora eu corrigi e tudo foi compilado corretamente!

 

Boa tarde.

A EA de repente começou a imprimir em cada tic-tac sem razão aparente:

2012.01.11 22:28:19 Complexo_Comum_01mod EURCHF,H1: subjanela número -1 desconhecido para a função ObjectCreate

Estou chamando o indicador personalizado no código (ver fig.):

//-------------- задаем значения индикатора Complex_Common по первому символу  --------
  double Complex_1_1=iCustom(NULL,Tf,"Complex_Common_01mod",Period_low,Period_fast,m,0); 
 //---------------задаем значения индикатора Complex_Common по второму символу ------------ 
  double Complex_1_2=iCustom(NULL,Tf,"Complex_Common_01mod",Period_low,Period_fast,n,0); 

Você poderia me dizer de onde vem o erro? Não estava lá antes. Eu mudei um pouco o código, sem sequer tocar na parte indicadora!

E o diário em cada carrapato começou a me dar esta mensagem...

Função ObjectCreate - não usar em código de forma alguma

 
O indicador procura pelo nome de sua janela e não o encontra. verhttps://docs.mql4.com/ru/customind/IndicatorShortName
 
Rita:

Obrigado, Integer!

Sim, - foi exatamente isso que aconteceu! Agora eu corrigi e tudo foi compilado corretamente!

Apenas, para obter o bilhete, você precisa refinar a função de Kim.
 
FAQ:
O indicador procura pelo nome de sua janela e não o encontra. verhttps://docs.mql4.com/ru/customind/IndicatorShortName


Então, acontece que este é um defeito do indicador? E não há uma falha no Expert Advisor? Não tenho certeza do que fazer com ele? Eu não preciso no código da EA chamar a janela deste indicador!

Por favor, informe como consertar este defeito, se possível. (- número de subjanela desconhecido -1 para a função ObjectCreate ) ?

Aqui está o código indicador:

#property copyright "SemSemFX@rambler.ru"
#property link      "http://onix-trade.net/forum/index.php?showtopic=107"
//индикатор  Complex_Common_01mod 

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Lime
#property indicator_color2 DodgerBlue
#property indicator_color3 Red
#property indicator_color4 Magenta
#property indicator_color5 Aqua
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2

extern int Period_low = 21;
extern int Period_fast = 8;
//---- buffers
double USD[];
double EUR[];
double GBP[];
double CHF[];
double JPY[];

int wndNum;                                // Номер подокна индикатора
string wndName;                            // Наименование окна

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,USD);
   SetIndexLabel(0, "USD"); 
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,EUR);
   SetIndexLabel(1, "EUR"); 
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,GBP);
   SetIndexLabel(2, "GBP"); 
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,CHF);
   SetIndexLabel(3, "CHF"); 
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,JPY);
   SetIndexLabel(4, "JPY"); 
 
//----
   return(0);
  }

int deinit()  {
  // Удаляем все графические объекты
  DeleteObject("USD"); 
  DeleteObject("EUR");
  DeleteObject("GBP");
  DeleteObject("CHF");
  DeleteObject("JPY"); 
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- проверка на возможные ошибки
     if(counted_bars<0) return(-1);
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars-=10;
     limit=Bars-counted_bars;
  //---- основной цикл
      int Price=6; int Mode=2;
    
     for(int i=0; i<limit; i++)
       {
        USD[i]=
            (iMA("EURUSD",0,Period_low,0,Mode,Price,i)-
            iMA("EURUSD",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("GBPUSD",0,Period_low,0,Mode,Price,i)-
            iMA("GBPUSD",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("USDCHF",0,Period_fast,0,Mode,Price,i)-
            iMA("USDCHF",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("USDJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("USDJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        EUR[i]=
            (iMA("EURUSD",0,Period_fast,0,Mode,Price,i)-
            iMA("EURUSD",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURGBP",0,Period_fast,0,Mode,Price,i)-
            iMA("EURGBP",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURCHF",0,Period_fast,0,Mode,Price,i)-
            iMA("EURCHF",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("EURJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        GBP[i]=
            (iMA("GBPUSD",0,Period_fast,0,Mode,Price,i)-
            iMA("GBPUSD",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("EURGBP",0,Period_low,0,Mode,Price,i)-
            iMA("EURGBP",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("GBPCHF",0,Period_fast,0,Mode,Price,i)-
            iMA("GBPCHF",0,Period_low,0,Mode,Price,i))*10000
            +
            (iMA("GBPJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("GBPJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        CHF[i]=
            (iMA("USDCHF",0,Period_low,0,Mode,Price,i)-
            iMA("USDCHF",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("EURCHF",0,Period_low,0,Mode,Price,i)-
            iMA("EURCHF",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("GBPCHF",0,Period_low,0,Mode,Price,i)-
            iMA("GBPCHF",0,Period_fast,0,Mode,Price,i))*10000
            +
            (iMA("CHFJPY",0,Period_fast,0,Mode,Price,i)-
            iMA("CHFJPY",0,Period_low,0,Mode,Price,i))*100
            ;
        JPY[i]=
            (iMA("USDJPY",0,Period_low,0,Mode,Price,i)-
            iMA("USDJPY",0,Period_fast,0,Mode,Price,i))*100
            +
            (iMA("EURJPY",0,Period_low,0,Mode,Price,i)-
            iMA("EURJPY",0,Period_fast,0,Mode,Price,i))*100
            +
            (iMA("GBPJPY",0,Period_low,0,Mode,Price,i)-
            iMA("GBPJPY",0,Period_fast,0,Mode,Price,i))*100
            +
            (iMA("CHFJPY",0,Period_low,0,Mode,Price,i)-
            iMA("CHFJPY",0,Period_fast,0,Mode,Price,i))*100
            ;
       }

   object("USD", "USD", 10, indicator_color1, 5);
   object("EUR", "EUR", 10, indicator_color2,18);
   object("GBP", "GBP", 10, indicator_color3,31);
   object("CHF", "CHF", 10, indicator_color4,44);
   object("JPY", "JPY", 10, indicator_color5,57);
  //----
    return(0);
  }
//+------------------------------------------------------------------+


// Удаляем графический объект
void DeleteObject(string name) {
  ObjectDelete(name+WindowExpertName());
}
// Рисуем метку
void object(string name, string _text, int fontsize, color color_, int value) {
 string objName = name+WindowExpertName();
 ObjectCreate(objName, OBJ_LABEL, WindowFind(WindowExpertName()), 0, 0);
 ObjectSetText(objName, _text, fontsize, "Verdana", color_);
 ObjectSet(objName, OBJPROP_CORNER, 1);
 ObjectSet(objName, OBJPROP_XDISTANCE, 4);
 ObjectSet(objName, OBJPROP_YDISTANCE, value); 
}
 
int wndNum;                                // Номер подокна индикатора  /// И ЭТО ТОЖЕ НЕ ИСПОЛЬЗУЕТЕ ВИДИМО ОСТАЛОСЬ ОТ ПРЕДЫДУЩЕГО ПИСАТЕЛЯ

string wndName=????;                            // Наименование окна /// ЧТО ЭТО ?????

// Удаляем графический объект
void DeleteObject(string name) {
  ObjectDelete(name+WindowExpertName());// Вы нашли окно предварительно? 
}
// Рисуем метку
void object(string name, string _text, int fontsize, color color_, int value) {
 string objName = name+WindowExpertName();
 ObjectCreate(objName, OBJ_LABEL, WindowFind(WindowExpertName()), 0, 0);// То же самое
 ObjectSetText(objName, _text, fontsize, "Verdana", color_);
 ObjectSet(objName, OBJPROP_CORNER, 1);
 ObjectSet(objName, OBJPROP_XDISTANCE, 4);
 ObjectSet(objName, OBJPROP_YDISTANCE, value); 
}
Não amarre o nome da janela ao nome do objeto, apenas nomeie os objetos com nomes únicos.
 
FAQ:
Não amarre o nome da janela ao nome do objeto, apenas nomeie os objetos com nomes únicos.

Obrigado, acho que consegui - vou tentar nomear e encontrar a janela agora.