Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 979

 
Rustam Bikbulatov:
Hola, necesito un consejo. ¿Por qué no aparece mi último texto? ¿Qué ocurre aquí? Por favor, ¿pueden decirme cómo solucionarlo?

¿Por qué necesitas un bucle si sólo tomas el nombre de un objeto en todo momento?

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);

No se puede hacer exactamente esto - estará fuera de los límites de la matriz. Si hay 10 objetos, el índice del último será 9. Porque cuenta desde cero.

 
Artyom Trishkin:

¿Por qué un bucle si sólo se toma el nombre de un objeto a la vez?

dígame exactamente cómo determinar el penúltimo texto de este objeto.

 
Rustam Bikbulatov:

dígame exactamente cómo determinar el penúltimo texto de este objeto.

Es difícil saber lo que quieres.

 
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 - muestra los beneficios totales durante la prueba durante el día

Provit1 - muestra la reducción máxima del día

Provit2 - fila numérica normal a partir de uno

Provit3 - ¡Objetivo! Suma Provit1 y divide por Provit2. Quiero saber la reducción media diaria para el tiempo total de la prueba. Ayuda para entender Provit3

 

Colegas, ¿qué puede ser este error de cierre y cómo solucionarlo? Aquí está el código de abajo, cuando el beneficio se supera - cerrar todas las posiciones unidireccionales. Gracias.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     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, ¿cuál puede ser este error de cierre y cómo afrontarlo? Si quiero usar el código de abajo, necesito cerrar todas las órdenes unidireccionales cuando sean rentables. Gracias.

¿Cuál es el error? Pantalla equivocada

en teoría debería funcionar, pero no he visto un cierre tan sofisticado teniendo en cuenta el spread y añadiéndolo como deslizamiento - imho, si decides cerrar, entonces el deslizamiento no es lo más importante a vigilar, los errores de cierre son más importantes, luego las recotizaciones, entonces la conexión se pierde completamente


Quita OrderClose(....) y sustitúyelo por ClosePosBySelect() de Kimhttps://www.mql5.com/ru/forum/131859/page2#comment_3359664

Utilizarlo, entonces se verá claramente donde se está rompiendo - ya sea en sus condiciones de cierre o en el servidor que tiene un error

 
Igor Makanu:

¿Cuál es el error? Pantalla equivocada

en teoría debería funcionar, pero no he visto un cierre tan sofisticado teniendo en cuenta el spread y añadiéndolo como deslizamiento - imho, si has decidido cerrar, entonces el deslizamiento no es lo más importante a vigilar, los errores de cierre son más importantes, luego las recotizaciones, entonces la conexión se pierde completamente


elimine OrderClose(....) y pase la entrada a ClosePosBySelect() de Kim en su lugar, entonces quedará claro dónde no funciona - ya sea en sus condiciones de cierre o el servidor tiene un error

Tiene un precio cero cerca de allí. En consecuencia, tenemos que controlar lo que fue devuelto por MarketInfo-function, pero no hay control. Sin embargo, como es habitual en cuatro, algunas personas están acostumbradas a escribir - algo recibido, lo que - no comprobar, pero envió un argumento.

 
Artyom Trishkin:

Tiene un precio cero cerca de allí. En consecuencia, tenemos que controlar lo que fue devuelto por MarketInfo-function, pero no hay control. Sin embargo, como es habitual en los cuatro algunas personas están acostumbradas a escribir - algo recibido, lo que - no comprobar, pero envió el argumento.

Lo he visto, dudo que sea capaz de deshacer todo por sí mismo, por eso le sugerí que usara el check ClosePosBySelect() para cerrar la orden seleccionada a través deOrderSelect( ) - él puede hacerlo, al menos lo he visto montando códigos con el constructor )))

SZY: Tengo otra sospecha de que cierra una orden dos veces, pero la función de Kim imprime en el registro, parece que no hay bucles separados para cerrar por la segunda condición

 
Igor Makanu:

Ya lo he visto, dudo que sea capaz de desprender todo por sí mismo, por eso sugería utilizar el cierre probado de una orden resaltada a través de OrderSelect()

Claro, las funciones de Igor lo harán todo por el usuario (e incluso algunos usuarios consiguen equivocarse con ellas). Pero en este caso, nunca aprenderá a hacer nada por sí mismo. Aunque, por supuesto, es su elección.