¿GLUCK? ¡¡¡Manejo de eventos de clic del ratón!!! - página 13

 
sergeev:


¡date prisa! Sólo ahora!!! ¡descarga este producto único!

Y se obtiene una versión con un error especialmente diseñado: ¡pequeños parpadeos de línea!


:))


¿tiene usted una solución a este problema? He mirado todo - no puedo pensar en nada más todavía, y no es un error, el cambio de las líneas es deliberada, pero se produce un error - he escrito el problema antes.

Yo ni siquiera diría que es un bache, es un cambio de líneas en el eje x.

 

¡Queridos colegas comerciantes!

Acabo de copiar un ejemplo del manual de .chm en la descripción de la función OrderSendAsync, con un simple botón que responde a un clic, en mi caso se ve así:

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//--- обработка события CHARTEVENT_CLICK ("Нажатие кнопки мышки на графике")
   if( id == CHARTEVENT_OBJECT_CLICK )
   {
      Print( "=> ", __FUNCTION__, ": sparam = ", sparam );
      if( sparam=="Finalize" )
      {
         PrintFormat( "Closing position %s",_Symbol );
         while( !ClosePosition() );

         //--- отожмем нажатую кнопку обратно
         ObjectSetInteger( 0, "Finalize", OBJPROP_STATE, false );
      }
      ChartRedraw();
   }      
}

void CreateFinalizeButton()
{
//--- проверим наличие объекта с именем "Finalize"
   if(ObjectFind(0,"Finalize")>=0)
   {
      //--- если найденный объект не является кнопкой, удалим его
      if(ObjectGetInteger(0,"Finalize",OBJPROP_TYPE)!=OBJ_BUTTON)
         ObjectDelete(0,"Finalize");
   }
   else
      ObjectCreate(0,"Finalize",OBJ_BUTTON,0,0,0); // создадим кнопку "Finalize"
//--- настроим кнопку "Finalize"
   ObjectSetInteger( 0, "Finalize", OBJPROP_CORNER, CORNER_LEFT_LOWER );
   ObjectSetInteger( 0, "Finalize", OBJPROP_XDISTANCE, 100 );
   ObjectSetInteger( 0, "Finalize", OBJPROP_YDISTANCE, 50 );
   ObjectSetInteger( 0, "Finalize", OBJPROP_XSIZE, 150 );
   ObjectSetInteger( 0, "Finalize", OBJPROP_YSIZE, 30 );
   ObjectSetString( 0, "Finalize", OBJPROP_TEXT, "Finalize" );
   ObjectSetInteger( 0, "Finalize", OBJPROP_COLOR, clrBlue );
//--- принудительно обновим график, чтобы кнопки отрисовались немедленно
   ChartRedraw();
}

Resulta que se activa cuando cambia el marco temporal. ¿Pueden decirme cómo se puede resolver este problema?

 
surava:

¡Queridos colegas comerciantes!

Acabo de copiar un ejemplo del manual de .chm en la descripción de la función OrderSendAsync, con un simple botón que responde a un clic, en mi caso se ve así:

Resulta que se activa cuando cambia el marco temporal. ¿Pueden decirme cómo se puede resolver este problema?

El ejemplo estándar de OrderSendAsync no reacciona al cambiar el periodo del gráfico. Esto significa que has metido la pata en algo. Necesitas más información: tipo de terminal, construcción del terminal y todo su código.
 
Karputov Vladimir:
El ejemplo estándar de OrderSendAsync no reacciona al cambio de periodo del gráfico. Esto significa que has metido la pata en algo. Necesita más información: tipo de terminal, construcción del terminal y su código completo.

Vladimir, ¡gracias por tu rápida respuesta!

Aquí está la información sobre el terminal:


Aquí está el código (acaba de empezar a aprender cómo funcionan las funciones comerciales):

#property copyright "surava"
#property link      "https://www.mql5.com"
#property version   "1.00"

ulong MagicNumber = 1649353089;

int OnInit()
{
   CreateFinalizeButton();

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   while( !ClosePosition() );
   
   if( ObjectFind( 0, "Finalize" ) >= 0 )
      ObjectDelete(0,"Finalize");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
{
 
}
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
   if( trans.type != TRADE_TRANSACTION_REQUEST )
      return;
   
   Print( "============= New transaction =============" );
   Print( __FUNCTION__, " Trans action: ", EnumToString( trans.type ) ); 
   Print( __FUNCTION__, " Trans order state: ", EnumToString( trans.order_state ) );    
   Print( __FUNCTION__, " Result order type: ", EnumToString( request.action ) );
   Print( __FUNCTION__, " Request action: ", EnumToString( request.type ) );
   Print( __FUNCTION__, " Deal price: ", result.price );   
   Print( __FUNCTION__, " Result comment: ", result.comment ); 
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//--- обработка события CHARTEVENT_CLICK ("Нажатие кнопки мышки на графике")
   if( id == CHARTEVENT_OBJECT_CLICK )
   {
      Print( "=> ", __FUNCTION__, ": sparam = ", sparam );
      if( sparam=="Finalize" )
      {
         PrintFormat( "Closing position %s",_Symbol );
         while( !ClosePosition() );

         //--- отожмем нажатую кнопку обратно
         ObjectSetInteger( 0, "Finalize", OBJPROP_STATE, false );
      }
      ChartRedraw();
   }      
}

void CreateFinalizeButton()
{
//--- проверим наличие объекта с именем "Finalize"
   if(ObjectFind(0,"Finalize")>=0)
   {
      //--- если найденный объект не является кнопкой, удалим его
      if(ObjectGetInteger(0,"Finalize",OBJPROP_TYPE)!=OBJ_BUTTON)
         ObjectDelete(0,"Finalize");
   }
   else
      ObjectCreate(0,"Finalize",OBJ_BUTTON,0,0,0); // создадим кнопку "Finalize"
//--- настроим кнопку "Finalize"
   ObjectSetInteger( 0, "Finalize", OBJPROP_CORNER, CORNER_LEFT_LOWER );
   ObjectSetInteger( 0, "Finalize", OBJPROP_XDISTANCE, 100 );
   ObjectSetInteger( 0, "Finalize", OBJPROP_YDISTANCE, 50 );
   ObjectSetInteger( 0, "Finalize", OBJPROP_XSIZE, 150 );
   ObjectSetInteger( 0, "Finalize", OBJPROP_YSIZE, 30 );
   ObjectSetString( 0, "Finalize", OBJPROP_TEXT, "Finalize" );
   ObjectSetInteger( 0, "Finalize", OBJPROP_COLOR, clrBlue );
//--- принудительно обновим график, чтобы кнопки отрисовались немедленно
   ChartRedraw();
}

bool ClosePosition( bool async = true )
{
   int numPos = PositionsTotal();
   PrintFormat( "Positions number: %d", numPos );
   
   if( PositionSelect( _Symbol ) )
      Print( "PositionSelect returned true" );
   else
      Print( "PositionSelect returned false" );
      
   if( numPos == 0 )
      return true;
       
   double volume = PositionGetDouble( POSITION_VOLUME );
   uint posType = PositionGetInteger( POSITION_TYPE );

   MqlTradeRequest req={0};
   req.action      = TRADE_ACTION_DEAL;
   req.symbol      = _Symbol;
   req.magic       = MagicNumber;
   req.volume      = volume;
   switch( posType )
   {
   case POSITION_TYPE_BUY:
      req.type = ORDER_TYPE_SELL;
      req.price = SymbolInfoDouble( req.symbol, SYMBOL_BID );
      break;
   case POSITION_TYPE_SELL:
      req.type = ORDER_TYPE_BUY;
      req.price = SymbolInfoDouble( req.symbol, SYMBOL_ASK );
      break;
   default:
      Print( "Wrong position type" );
      return true;
   }
   req.deviation   = 3;
   req.comment     = "Closing opened position";
   MqlTradeResult  res={0};
   if( !OrderSend( req, res ) )
   {
      Print(__FUNCTION__,": ошибка ",GetLastError(),", retcode = ",res.retcode);
      return false;
   }
   return true;
}
 
surava:

Vladimir, ¡gracias por tu rápida respuesta!

Aquí está la información sobre el terminal:


Aquí está el código (acaba de empezar a aprender cómo funcionan las funciones de comercio):

De un vistazo - quitar mientras.
 
Karputov Vladimir:
A primera vista, quitar mientras.
No cuesta nada eliminarlo, pero es evidente que el problema está en otra parte. En cuanto a mí, prefiero que el problema de una posición no cerrada a tiempo dé lugar a un bucle sin fin que a una pérdida, que tal vez ni siquiera pueda notar de inmediato).
 

Ya veo cuál es el problema. Explica esta lógica, por favor, por qué el manejador del botón se ve afectado por la presencia/ausencia de la línea

input bool DescriptionModeFull=true;

???

 

Parece que no es sólo esta línea. Tendré que bailar un poco más para que el metatrader torcido funcione bien...

Es decir, en mi ejemplo funcionaba bien, pero en el programa real no((

 
surava:

Es decir, en mi ejemplo funcionaba bien, pero en el programa real no((

¿Tal vez hay una torcedura en algún otro lugar? No llegarás muy lejos con ese enfoque

 
surava:

Parece que no es sólo esta línea. Tendré que bailar un poco más para que el metatrader torcido funcione bien...

Es decir, en mi ejemplo funcionaba bien, pero en el programa real no((

¿Tal vez mi pandereta no es lo suficientemente grande?