Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 979

 
Rustam Bikbulatov:
Olá, eu preciso de alguns conselhos. Por que meu último texto não está aparecendo? O que há de errado aqui? Você pode me dizer como consertar isso?

Por que você precisa de um loop se você só leva o nome de um objeto em todos os momentos?

for(int no1=0; no1<ObjectsTotal(OBJ_TEXT); no1++)
  {
   if(ObjectName(0)=="Profit1"+iBarShift(NULL,1440,0))
     {
      double name;
      name = ObjectDescription(0);;
      Comment(name);
     }
  }
 

Iurii Tokman:

no1<=ObjectsTotal(OBJ_TEXT);

Você não pode exatamente fazer isso - estará fora dos limites da matriz. Se houver 10 objetos, o índice do último será 9. Porque conta a partir de zero.

 
Artyom Trishkin:

Por que um loop se você só leva o nome de um objeto de cada vez?

me diga exatamente como determinar o penúltimo texto deste objeto.

 
Rustam Bikbulatov:

me diga exatamente como determinar o penúltimo texto deste objeto.

É difícil saber o que você quer.

 
void Profit()
  {
   ObjectCreate("Profit"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.6);
   ObjectSetText("Profit"+iBarShift(NULL,1440,0),DoubleToStr(AccountProfit(),2),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit1()
  {
   double  Prof = ObjectDescription("Profit1"+iBarShift(NULL,1440,0));
   double  P = -Prof;
   ObjectCreate("Profit1"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.1);
   ObjectSetText("Profit1"+iBarShift(NULL,1440,0),DoubleToStr(MathMax(-AccountProfit(),-P),1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit1"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit2()
  {
   ObjectCreate("Profit2"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.4);
   ObjectSetText("Profit2"+iBarShift(NULL,1440,0),iBarShift(NULL,1440,0)-1000,11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit2"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit3()
  {
   for(int no1=0; no1<=ObjectsTotal(OBJ_TEXT); no1++)
     {
      if(ObjectFind(1,"Profit2"+iBarShift(NULL,1440,0))!=0)
        {

         string   obj_name;
         obj_name = ObjectName(3);
         string   name;
         name = ObjectDescription(obj_name);
         Comment(obj_name);
        }
     }

   ObjectCreate("Profit3"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.9);
   ObjectSetText("Profit3"+iBarShift(NULL,1440,0),DoubleToStr(name,1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit3"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }

Provit - mostra lucros totais durante o teste durante o dia

Provit1 - mostra o saque máximo para o dia

Provit2 - linha numérica normal a partir de uma

Provit3 - Alvo! Resumir Provit1 e dividir por Provit2. Quero saber a média diária de sorteio para o tempo total do teste. Ajuda para entender a Provit3

 

Colegas - o que poderia ser este erro de proximidade e como lidar com ele? Aqui está o código abaixo, quando o lucro é excedido - fechar todas as posições unidirecionais. Obrigado.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if(takeprofit < ProfitB)    
      {   
        Print(" ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = ", ProfitB," мин общий takeprofit buys positions = ", takeprofit);   
        for (i=OrdersTotal()-1; i>=0; i--)         
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if(OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray))  
                   Print(" закрытие бай, тикет = ", OrderTicket());
               else  Print(" ошибка закрытия бай, Error = ", GetLastError());          
            }
       }     
      
       if(takeprofit < ProfitS)     
        { 
         Print(" ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = ", ProfitS," мин общий takeprofit СЕЛЛов = ", takeprofit);   
 
         for (i=OrdersTotal()-1; i>=0; i--)      
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if(OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray)) 
                   Print(" закрытие SELL,  тикет = ", OrderTicket());
               else   Print(" ошибка закрытия sell, Error = ", GetLastError());     
            }       
         }    
           
 
Roman Shiredchenko:

Colegas, o que pode ser esse erro de fechamento e como lidar com ele? Se eu quiser usar o código abaixo, preciso fechar todas as ordens unidirecionais quando elas forem lucrativas. Obrigado.

Qual é o erro? tela errada

em teoria deveria funcionar, mas eu não vi um fechamento tão sofisticado levando em conta a dispersão e acrescentando como deslizamento - imho, se você decidir fechar, então o deslizamento não é o mais importante a ser observado, erros de fechamento são mais importantes, então solicitações, então a conexão é perdida completamente


Leve OrderClose(....) embora e substitua-o pelo ClosePosBySelect() da Kimhttps://www.mql5.com/ru/forum/131859/page2#comment_3359664

usá-lo, então você verá claramente onde ele está quebrando - seja em suas condições de fechamento ou no servidor que tem um bug

 
Igor Makanu:

Qual é o erro? tela errada

em teoria deveria funcionar, mas eu não vi um fechamento tão sofisticado levando em conta a dispersão e acrescentando como deslizamento - imho, se você decidir fechar, então o deslizamento não é a coisa mais importante a ser observada, erros de fechamento são mais importantes, então solicitações, então a conexão é perdida completamente


remova OrderClose(....) e passe o ticket para ClosePosBySelect() da Kim, em vez disso, ele ficará claro onde não funciona - seja em suas condições de fechamento ou o servidor tenha um bug

Ele tem um preço zero ali perto. Por conseguinte, precisamos controlar o que foi devolvido pelo MarketInfo-function, mas não há controle. Entretanto, como de costume em quatro, algumas pessoas estão acostumadas a escrever - algo recebido, o que - não verificou, mas enviou um argumento.

 
Artyom Trishkin:

Ele tem um preço zero ali perto. Por conseguinte, precisamos controlar o que foi devolvido pelo MarketInfo-function, mas não há controle. No entanto, como de costume nas quatro pessoas, algumas estão acostumadas a escrever - algo recebido, o que - não verificou, mas enviou o argumento.

Eu o vi, duvido que ele mesmo consiga desajustar tudo, por isso sugeri usar ClosePosBySelect() para fechar a ordem selecionada viaOrderSelect( ) - ele pode fazer isso, pelo menos eu o vi montando códigos com o construtor ))))

SZY: Tenho outra suspeita de que fecha uma ordem duas vezes, mas as impressões de f-função de Kim no tronco, parece que não há laços separados para fechar pela 2ª condição

 
Igor Makanu:

Eu já vi, duvido que ele seja capaz de desempatar tudo por si só, por isso sugeri usar o fechamento comprovado de uma ordem em destaque via OrderSelect()

Claro, as funções de Igor farão tudo para o usuário (e até alguns usuários conseguem cometer um erro com eles). Mas, neste caso, ele próprio nunca aprenderá a fazer nada. Embora, é claro - sua escolha.