GLUCK?! Gestione degli eventi del clic del mouse!!! - pagina 13

 
sergeev:


sbrigati! Solo ora!!! scarica questo prodotto unico!

E si ottiene una versione con un bug appositamente progettato - piccoli blip di linea!


:))


Hai una soluzione a questo problema? Ho guardato attraverso tutto - non riesco a pensare a nient'altro ancora, e non è un bug, cambiare le linee è intenzionale, ma si blocca - ho scritto il problema prima.

Non direi nemmeno che sta lampeggiando, sta spostando le linee lungo l'asse x.

 

Cari colleghi commercianti!

Ho appena copiato un esempio dal manuale .chm nella descrizione della funzione OrderSendAsync, con un semplice pulsante che risponde a un clic, nel mio caso appare così:

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

A quanto pare, si innesca quando cambia l'orizzonte temporale. Potete per favore dirmi come si può risolvere questo problema?

 
surava:

Cari colleghi commercianti!

Ho appena copiato un esempio dal manuale .chm nella descrizione della funzione OrderSendAsync, con un semplice pulsante che risponde a un clic, nel mio caso appare così:

A quanto pare, si innesca quando cambia l'orizzonte temporale. Potete per favore dirmi come si può risolvere questo problema?

L'esempio standard di OrderSendAsync non reagisce al cambiamento del periodo del grafico. Questo significa che avete sbagliato qualcosa. Avete bisogno di più informazioni: tipo di terminale, build del terminale e tutto il vostro codice.
 
Karputov Vladimir:
L'esempio standard di OrderSendAsync non reagisce al cambiamento del periodo del grafico. Questo significa che avete sbagliato qualcosa. Avete bisogno di più informazioni: tipo di terminale, build del terminale e tutto il vostro codice.

Vladimir, grazie per la tua pronta risposta!

Ecco le informazioni sul terminale:


Ecco il codice (ho appena iniziato a imparare come funzionano le funzioni di trading):

#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, grazie per la tua pronta risposta!

Ecco le informazioni sul terminale:


Ecco il codice (ho appena iniziato a imparare come funzionano le funzioni di trading):

A colpo d'occhio - rimuovere mentre.
 
Karputov Vladimir:
A prima vista, rimuovere mentre.
Non costa nulla rimuoverlo, ma è ovvio che il problema sta altrove. Per quanto mi riguarda - meglio il problema di una posizione non chiusa in tempo si tradurrà in un loop infinito che una perdita, che si può anche non essere in grado di notare subito).
 

Ho capito qual è il problema. Spiega solo questa logica, per favore, perché il gestore del pulsante è influenzato dalla presenza/assenza della linea

input bool DescriptionModeFull=true;

???

 

Sembra che non sia solo questa linea. Dovrò fare qualche altro balletto per far funzionare bene il metatrader storto...

Cioè nel mio esempio ha funzionato bene, ma nel programma reale no((

 
surava:

Cioè nel mio esempio ha funzionato bene, ma nel programma reale no((

Forse c'è una perversione da qualche altra parte? Non andrai molto lontano con questo approccio

 
surava:

Sembra che non sia solo questa linea. Dovrò fare qualche altro balletto per far funzionare bene il metatrader storto...

Cioè nel mio esempio ha funzionato bene, ma nel programma reale no((

Forse il mio tamburello non è abbastanza grande?