Erros, bugs, perguntas - página 2737

 

No MT4, enquanto os indicadores de depuração ficam pendurados permanentemente se se mudar para um gráfico.

Reproduzido, por exemplo, durante o início da depuração do indicador CCI padrão.

1. Estabelecer um ponto de parada;

2. Imprensa F5;

3. Mudar para o gráfico.

Resultado - o gráfico de depuração fica pendurado.

Também pode simplesmente premir F5 várias vezes durante a depuração - o gráfico fica pendurado.

Construir 1260.

Configurações do depurador:


 
Comentários não relacionados com este tópico foram transferidos para "Perguntas dos principiantes do MQL4 MT4 MetaTrader 4".
 

O resultado da pesquisa apaga parte do texto.


Aqui está o original.

Fórum sobre negociação, sistemas de negociação automatizados e testador de estratégias

MetaTrader 5 Strategy Tester: bugs, bugs, sugestões para melhorias

fxsaber, 2020.05.11 20:31

Provavelmente não faz sentido para o Testador criar ficheiros opt-files que tenham Header.passes_passed== 0.
 
Muito raramente se trabalha com objectos gráficos, surgiu a necessidade de colorir o fundo para OBJ_LABLE (set OBJPROP_BGCOLOR).
Como se verificou, a definição da cor de fundo não é possível para um objecto do tipo OBJ_LABLE, é necessário utilizar OBJ_EDIT.
Ao utilizar OBJ_EDIT, surgiu um novo problema - a necessidade de definir o tamanho de OBJPROP_XSIZE e OBJPROP_YSIZE de modo a que todo o texto caiba nas dimensões dos objectos correspondentes.

Pergunta: como determinar os tamanhos OBJPROP_XSIZE e OBJPROP_YSIZE para caber no texto inteiro?
Considerei duas opções:
1. Criação de objecto OBJ_LABLE, leitura das suas dimensões, eliminação de objecto OBJ_LABLE.
Não adequado porque o dimensionamento só é possível após o objecto ter sido realmente criado e não é possível quando o objecto está na fila ChartRedraw.

2. utilizando TextSetFont seguido de TextGetSize.
Não adequado, porque o resultado é radicalmente diferente dos resultados do método #1, a diferença de 2,5 - 2,9 vezes, dependendo do tamanho da fonte.
Provavelmente a razão é o monitor de 4K e 175% DPI.

#define  PRINT(x) ; Print(#x, ":", string(x))
          
void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma")
{
   ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); 
   ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); 
   ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); 
   ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font);
   ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); 
   ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0);
   ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y);
}

void OnStart(){     
   string obj_name = "test_obj";   
   string text = "AAAA::BBBB";
   int font_size = 7;
   string font_name = "Tahoma";
   
   SetLabel(0, obj_name, 0, text, clrWhite, 100, 100, 0, font_size, font_name);
   ChartRedraw(0);
   Sleep(1000);
   
   uint dx_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_XSIZE));
   uint dy_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_YSIZE));
   ObjectDelete(0, obj_name);
   
   PRINT(dx_fixed_0);
   PRINT(dy_fixed_0);
   
   
   uint dx_fixed_1;
   uint dy_fixed_1;
   TextSetFont(font_name, -10 *  font_size);
   TextGetSize(text, dx_fixed_1, dy_fixed_1);
   
   PRINT(1.0 * dx_fixed_0 / dx_fixed_1);  	// Result: 1.0
   PRINT(1.0 * dy_fixed_0 / dy_fixed_1);  	// Result: 1.0
}  


Graças aGeess pelasolução.
É necessário multiplicar por -10 o tamanho do embaralhamento quando o passar para TextSetFont.

 
Sergey Dzyublik:
Raramente trabalho com objectos gráficos, preciso de pintar a cor de fundo para OBJ_LABLE (definir OBJPROP_BGCOLOR).
Como se verificou, a definição da cor de fundo não é possível para um objecto do tipo OBJ_LABLE, é necessário utilizar OBJ_EDIT.
Ao utilizar OBJ_EDIT, surgiu um novo problema - a necessidade de definir o tamanho de OBJPROP_XSIZE e OBJPROP_YSIZE de modo a que todo o texto caiba nas dimensões dos objectos correspondentes.

Pergunta: como determinar os tamanhos OBJPROP_XSIZE e OBJPROP_YSIZE para caber no texto inteiro?
Considerei duas opções:
1. criar objecto OBJ_LABLE, ler as dimensões, apagar objecto OBJ_LABLE.
Não adequado porque o dimensionamento só é possível após o objecto ter sido realmente criado e não é possível quando o objecto está na fila ChartRedraw.

2. utilizando TextSetFont seguido de TextGetSize.
Não adequado, porque o resultado é radicalmente diferente dos resultados do método #1, a diferença de 2,5 - 2,9 vezes, dependendo do tamanho da fonte.
Provavelmente a razão é o monitor de 4K e 175% DPI.

Em primeiro lugar, o tamanho do texto e o tamanho do objecto não são a mesma coisa. No mínimo, tem de haver uma fronteira. E, portanto, estes valores não podem coincidir.
Em segundo lugar, é melhor usar OBJ_BITMAP_LABEL que não tem limitações.
E se o utilizar, é melhor usar a classe CCanvas.

#include <Canvas\Canvas.mqh>
          
void SetLabel(CCanvas &c, long achart, string name, int wnd, string text, color clr_text, color clr_bckgrnd, int x, int y, int corn=0, int fontsize=8, int border=2, string font="Tahoma", uchar transparency=0xFF)
{
   uint w,h;
   c.FontSet(font, fontsize);
   c.TextSize(text, w, h);
   if(!c.CreateBitmapLabel(achart,wnd,name,x,y,w+border*2,h+border*2,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas object: ", GetLastError());
   c.Erase(ColorToARGB(clr_bckgrnd,transparency));
   c.TextOut(border,border,text,ColorToARGB(clr_text,transparency));
   c.Update();
}

void OnStart(){     
   string obj_name = "test_obj";   
   string text = "AAAA::BBBB";
   int font_size = 17;
   string font_name = "Tahoma";
   CCanvas Can;
   SetLabel(Can,0, obj_name, 0, text, clrYellow, clrBlue, 100, 100, 0, font_size,3, font_name, 0x80);
   Sleep(10000);
   Can.Destroy();
}  

O resultado é o mesmo objecto, só que com mais possibilidades. Por exemplo, ao acrescentar transparência ao rótulo de texto.


 
Geess:

Em primeiro lugar, o tamanho do texto e o tamanho do objecto não são a mesma coisa. No mínimo, deve haver uma fronteira. E, por isso, estes valores não podem coincidir.

Muito obrigado pela vossa ajuda.
Está a adaptar uma solução pronta às suas próprias necessidades, por isso não vejo a necessidade de implementar bibliotecas.
A solução que propôs inicialmente pode ser representada como:

void SetBitmapLabel(long achart, string name, int wnd, string text, color clr, color bgclr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma", int border=2)
{
   uint w,h;
   TextSetFont(font,-10* fontsize,0,0);
   TextGetSize(text,w,h);
   w = w+border*2;
   h = h+border*2;
   
   uint pixels[];
   ArrayResize(pixels,w*h);
   ArrayInitialize(pixels,0);
   ENUM_COLOR_FORMAT color_format = COLOR_FORMAT_XRGB_NOALPHA;
   string resource_name="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
   
   ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format);
   ObjectCreate(achart,name,OBJ_BITMAP_LABEL,wnd,0,0);
   ObjectSetInteger(achart,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(achart,name,OBJPROP_YDISTANCE,y);
   ObjectSetString(achart,name,OBJPROP_BMPFILE,resource_name);
   ArrayInitialize(pixels,ColorToARGB(bgclr));
   TextOut(text,border,border,0,pixels,w,h,ColorToARGB(clr),color_format);
   ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format);
}

void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma")
{
        ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); 
        ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); 
        ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); 
        ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font);
        ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); 
        ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0);
        ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y);
}

void OnStart(){     
   string obj_name = "test_obj";   
   string text = "AAAA::BBBB";
   int font_size = 50;
   string font_name = "Tahoma";
   
   SetBitmapLabel(0, "BL" + obj_name, 0, text, clrRed, clrWhite, 100, 100, 0, font_size, font_name);
   SetLabel      (0, "L"  + obj_name, 0, text, clrRed,           100, 200, 0, font_size, font_name);
   ChartRedraw(0);
   Sleep(10000);
}  


Infelizmente, devido a um defeito no MT5 - a solução proposta não pode ser utilizada normalmente.
O tamanho do texto revela-se 3 vezes menor do que o necessário num monitor de 4K com 175% de DPI do Windows.
Tenho de multiplicar o tamanho da fonte por DPI / 100% * [1,6 ... 1,8]

ObrigadoGeesspelasolução.
É necessário multiplicar o tamanho da fonte por -10 quando a passar paraTextSetFont.




 
Sergey Dzyublik:

Muito obrigado pela vossa ajuda.
Está a adaptar uma solução pronta às suas próprias necessidades, por isso não vejo a necessidade de implementar bibliotecas.
A solução que propôs inicialmente pode ser representada como:


Infelizmente, devido a um defeito no MT5 - a solução proposta não pode ser utilizada normalmente.
O tamanho do texto revela-se 3 vezes menor do que o necessário num monitor de 4K com 175% de DPI do Windows.
Tenho de multiplicar o tamanho da fonte por DPI / 100% * [1,6 ... 1,8].

https://www.mql5.com/ru/docs/objects/textsetfont


tem de o fazer desta forma:

void SetBitmapLabel(long achart, string name, int wnd, string text, color clr, color bgclr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma", int border=2, uchar transparency=0xFF)
{
   uint w,h;
   TextSetFont(font,-10*fontsize,0,0);
   TextGetSize(text,w,h);
   w = w+border*2;
   h = h+border*2;
   
   uint pixels[];
   ArrayResize(pixels,w*h);
   ArrayInitialize(pixels,0);
   ENUM_COLOR_FORMAT color_format = COLOR_FORMAT_ARGB_NORMALIZE;
   string resource_name="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
   
   ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format);
   ObjectCreate(achart,name,OBJ_BITMAP_LABEL,wnd,0,0);
   ObjectSetInteger(achart,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(achart,name,OBJPROP_YDISTANCE,y);
   ObjectSetString(achart,name,OBJPROP_BMPFILE,resource_name);
   ObjectSetInteger(achart,name,OBJPROP_BACK,false);
   ArrayInitialize(pixels,ColorToARGB(bgclr, transparency));
   TextOut(text,border,border,0,pixels,w,h,ColorToARGB(clr, transparency),color_format);
   ResourceCreate(resource_name,pixels,w,h,0,0,0,color_format);
}

void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma")
{
        ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); 
        ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); 
        ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); 
        ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font);
        ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); 
        ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0);
        ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y);
}

void OnStart(){     
   string obj_name = "test_obj";   
   string text = "AAAA::BBBB";
   int font_size = 50;
   string font_name = "Tahoma";
   
   SetBitmapLabel(0, "BL" + obj_name, 0, text, clrRed, clrBlue, 100, 100, 0, font_size, font_name,2,0xA0);
   SetLabel      (0, "L"  + obj_name, 0, text, clrBlue,         100, 200, 0, font_size, font_name);
   ChartRedraw(0);
   Sleep(10000);
}



Não percebo porque precisa tanto de OBJ_LABEL? Implementou uma variante sem bibliotecas com OBJ_BITMAP_LABEL. Qual é a sua vantagem? Vejo apenas uma limitação.

 
Alvo
Geess:

https://www.mql5.com/ru/docs/objects/textsetfont
Não percebo porque precisa tanto de OBJ_LABEL? Implementou uma variante sem bibliotecas com OBJ_BITMAP_LABEL. Qual é a sua vantagem? Vejo apenas uma limitação.

Muito obrigado, mais uma vez.
Não sabia, não via, não lia, sobre multiplicação por -10. Problema resolvido.
OBJ_LABEL foi utilizado para ilustrar o problema e ser capaz de o reproduzir.

 
Olá!

Por favor, digam-me qual é o problema.

Os diferentes indicadores, que estão a funcionar correctamente e a actualizar, começam a mostrar algo diferente, não baseado na tabela de preços apresentada na janela principal. Acontece ocasionalmente, não todos os dias.

No início culpava os indicadores, mas depois de experimentar indicadores diferentes, incluindo os nativos do MT5, estou desconfiado acerca do terminal. Observo o problema há muito tempo, desde o ano passado, em diferentes versões do terminal. Primeiro foi na versão personalizada da Alpari, agora é a mesma na versão original. Tanto em conta de demonstração como em ecn real.

Corretor Alpari. MT5 construir 2363 a partir de 13.03.2020. Não me lembro de outros períodos, mas acontece definitivamente no M1.

Capturas de ecrã:

Variante "escorregadela". Com excepção do ziguezague, todos os indicadores estão incorporados. O ziguezague com o trabalho correcto com a história. As leituras dos indicadores são convergentes entre si. Não correspondem aos preços.

Após a actualização.

Versão MT5

Arquivos anexados:
 

Tarde.

Tropeçou numa coisa incompreensível e não compreende o que é.

Há duas funções que são utilizadas em estratégias diferentes. Logicamente, o código em controlos como

if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)

Não deve ser executado se uma das condições estiver errada. Mas por alguma razão é executado se o número mágico e o número mágico passado para a função NÃO forem IGUAL.

Parece ser uma comparação do tipo inteiro. Não consigo compreender porquê. Pode vê-lo na imagem de ecrã que se segue.


void OpenNextBuyPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt)
{
   for(int i=PositionsTotal()-1;i>=0;i--)
     if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
       if(m_position.Symbol()==m_symbol.Name())
       {
          if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)
          {
             if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
             {
                if(IsSetBuy(magic,ExtDP)==true)
                {
                    double cdist=MathFloor(MathAbs((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP));
                    Print("#1122 cdist ",numstr,": ",cdist);
                    Print("#2211! m_position.PriceOpen(): ",m_position.PriceOpen());
                    Print("#2212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                    Print("#2213! ExtDP: ",ExtDP);
                    Print("#2214! magic: ",magic);
                    Print("#2215! ev: ",ev);
                    Print("#2216! iuv: ",iuv);
                    Print("#2217! m_position.Volume(): ",m_position.Volume());
                    Print("#2218! m_position.Magic(): ",m_position.Magic());
                    
                   
                    if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                       ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                        ev=NormalizeDouble(imv,2);
                     rev=ev;
                     double sl=0.0;
                     double tp=0.0;
                     if(itp>0) tp=m_symbol.Ask()+etp;
                     if(isl>0) sl=m_symbol.Bid()-esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if(OpenBuy(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt=POSITION_TYPE_BUY;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_BUY)); 
                        Print("#516! Position BUY after down SELL "+numstr);                                 
                        //Sleep(3000);
                        continue;
                     }
                  }
               }
            }
            if(m_position.PositionType()==POSITION_TYPE_BUY  && m_position.Magic()==magic)
            {
               if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
               {
                  if(IsSetBuy(magic,ExtDP)==true)
                  {
                     double cdist=MathFloor(MathAbs((m_position.PriceOpen()-m_position.PriceCurrent())/ExtDP));
                     Print("#1123 cdist ", numstr," : ",cdist);
                     Print("#3211! m_position.PriceOpen(): ",m_position.PriceOpen());
                     Print("#3212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                     Print("#3213! ExtDP: ",ExtDP);
                     Print("#3214! magic: ",magic);
                     Print("#3215! ev: ",ev);
                     Print("#3216! iuv: ",iuv);
                     Print("#3217! m_position.Volume(): ",m_position.Volume());
                     Print("#3218! m_position.Magic(): ",m_position.Magic());
                    
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                        ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                        ev=NormalizeDouble(imv,2); 
                     rev=ev;                          
                     double sl=0.0;
                     double tp=0.0;
                     if(itp>0) tp=m_symbol.Ask()+etp;
                     if(isl>0) sl=m_symbol.Bid()-esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if(OpenBuy(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt=POSITION_TYPE_BUY;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_BUY)); 
                        Print("#517! Position BUY After down BUY "+numstr);                                 
                        //Sleep(3000);
                        continue;
                     }
                  }
               } 
            }
         }
}


void OpenNextSellPositionBySignal(CTrade &m_trade,long magic,double ExtDP,double iuv,double imv,int itp,int isl,double etp,double esl,double ev,double &rev,string numstr,ulong &last_pt)
{
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
         {
            if(m_position.PositionType()==POSITION_TYPE_BUY  && m_position.Magic()==magic)
            {
               if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
               {
                  if(IsSetSell(magic,ExtDP)==true)
                  {
                     double cdist=MathFloor(MathAbs((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP));
                     Print("#1124 cdist ", numstr," : ",cdist);
                     Print("#4211! m_position.PriceOpen(): ",m_position.PriceOpen());
                     Print("#4212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                     Print("#4213! ExtDP: ",ExtDP);
                     Print("#4214! magic: ",magic);
                     Print("#4215! ev: ",ev);
                     Print("#4216! iuv: ",iuv);
                     Print("#4217! m_position.Volume(): ",m_position.Volume());
                     Print("#4218! m_position.Magic(): ",m_position.Magic());
                   
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                        ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                     if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                        ev=NormalizeDouble(imv,2);
                     rev=ev;
                     double sl=0.0;
                     double tp=0.0;
                     if(itp>0) tp=m_symbol.Bid()-etp;
                     if(isl>0) sl=m_symbol.Ask()+esl;
                     //m_trade.SetExpertMagicNumber(magic);
                     if(OpenSell(m_trade,ev,sl,tp,numstr))
                     {
                        last_pt=POSITION_TYPE_SELL;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_SELL)); 
                        Print("#518! Position SELL After down BUY "+numstr);                             
                        //Sleep(3000);
                        continue;
                      }
                   }
                }
             }
             if(m_position.PositionType()==POSITION_TYPE_SELL  && m_position.Magic()==magic)
             {
                if((m_position.Profit()+m_position.Swap()+m_position.Commission())<0)
                {
                   if(IsSetSell(magic,ExtDP)==true)
                   {
                      double cdist=MathFloor(MathAbs((m_position.PriceCurrent()-m_position.PriceOpen())/ExtDP));
                      Print("#1125 cdist ", numstr," : ",cdist);
                      Print("#5211! m_position.PriceOpen(): ",m_position.PriceOpen());
                      Print("#5212! m_position.PriceCurrent(): ",m_position.PriceCurrent());
                      Print("#5213! ExtDP: ",ExtDP);
                      Print("#5214! magic: ",magic);
                      Print("#5215! ev: ",ev);
                      Print("#5216! iuv: ",iuv);
                      Print("#5217! m_position.Volume(): ",m_position.Volume());
                      Print("#5218! m_position.Magic(): ",m_position.Magic());
                    
                      if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)<=imv)
                         ev=NormalizeDouble(m_position.Volume()+iuv*cdist,2);
                      if(NormalizeDouble(m_position.Volume()+iuv*cdist,2)>imv)
                         ev=NormalizeDouble(imv,2); 
                      rev=ev;                             
                      double sl=0.0;
                      double tp=0.0;
                      if(itp>0) tp=m_symbol.Bid()-etp;
                      if(isl>0) sl=m_symbol.Ask()+esl;
                      //m_trade.SetExpertMagicNumber(magic);
                      if(OpenSell(m_trade,ev,sl,tp,numstr))
                      {
                        last_pt=POSITION_TYPE_SELL;
                        FileWrite(filehandle,numstr+", ",TimeCurrent(),", ",GetLastPositionsType(magic),", ",GetPositionTicket(magic,POSITION_TYPE_SELL)); 
                        Print("#519! Position SELL After down SELL "+numstr);                                 
                        //Sleep(3000);
                        continue;
                      }
                   }
                }
             }
          }
}


revista
Заранее спасибо за ответ.