GLUCK?! Mausklick-Ereignisbehandlung!!! - Seite 13

 
sergeev:


Beeilen Sie sich! Nur jetzt!!! laden Sie dieses einzigartige Produkt herunter!

Und Sie erhalten eine Version mit einem speziell entwickelten Fehler - kleine Linienfehler!


:))


Haben Sie eine Lösung für dieses Problem? Ich habe alles durchgesehen - mir fällt noch nichts anderes ein, und es ist kein Fehler, das Ändern der Zeilen ist beabsichtigt, aber es stört - ich habe das Problem schon einmal geschrieben.

Ich würde nicht einmal sagen, dass es sich um einen Ausschlag handelt, sondern um eine Verschiebung der Linien entlang der X-Achse.

 

Liebe Kolleginnen und Kollegen im Handel!

Ich habe gerade ein Beispiel aus dem .chm-Handbuch in der Beschreibung der Funktion OrderSendAsync kopiert, mit einer einfachen Schaltfläche, die auf einen Klick reagiert, in meinem Fall sieht es so aus:

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

Wie sich herausstellt, wird sie ausgelöst, wenn sich der Zeitrahmen ändert. Können Sie mir bitte sagen, wie dieses Problem gelöst werden kann?

 
surava:

Liebe Kolleginnen und Kollegen im Handel!

Ich habe gerade ein Beispiel aus dem .chm-Handbuch in der Beschreibung der Funktion OrderSendAsync kopiert, mit einer einfachen Schaltfläche, die auf einen Klick reagiert, in meinem Fall sieht es so aus:

Wie sich herausstellt, wird sie ausgelöst, wenn sich der Zeitrahmen ändert. Können Sie mir bitte sagen, wie dieses Problem gelöst werden kann?

Das Standardbeispiel für OrderSendAsync reagiert nicht auf die Änderung der Chartperiode. Das bedeutet, dass Sie etwas verbockt haben. Sie benötigen weitere Informationen: Terminaltyp, Build des Terminals und Ihren gesamten Code.
 
Karputov Vladimir:
Das Standardbeispiel für OrderSendAsync reagiert nicht auf den Wechsel der Chartperiode. Das bedeutet, dass Sie etwas verbockt haben. Sie benötigen weitere Informationen: Terminal-Typ, Terminal-Build und Ihren gesamten Code.

Vladimir, vielen Dank für Ihre prompte Antwort!

Hier sind die Informationen über das Terminal:


Hier ist der Code (ich habe gerade angefangen zu lernen, wie Handelsfunktionen funktionieren):

#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, vielen Dank für Ihre prompte Antwort!

Hier sind die Informationen über das Terminal:


Hier ist der Code (ich habe gerade angefangen zu lernen, wie die Handelsfunktionen funktionieren):

Auf einen Blick - Entfernen während.
 
Karputov Vladimir:
Auf den ersten Blick, während entfernen.
Es kostet nichts, ihn zu entfernen, aber es ist offensichtlich, dass das Problem woanders liegt. Für mich ist das Problem, dass eine nicht rechtzeitig geschlossene Position zu einer Endlosschleife führt, besser als ein Verlust, den man vielleicht nicht einmal sofort bemerkt.)
 

Ich verstehe, wo das Problem liegt. Erläutern Sie bitte diese Logik, warum der Button-Handler durch das Vorhandensein/Fehlen der Zeile beeinflusst wird

input bool DescriptionModeFull=true;

???

 

Es sieht so aus, als ob es sich nicht nur um diese Linie handelt. Ich werde noch ein bisschen tanzen müssen, damit der krumme Metatrader richtig funktioniert...

D.h. in meinem Beispiel hat es gut funktioniert, aber im echten Programm nicht((

 
surava:

D.h. in meinem Beispiel hat es gut funktioniert, aber im echten Programm nicht((

Vielleicht gibt es irgendwo anders einen Knick? Mit diesem Ansatz werden Sie nicht sehr weit kommen

 
surava:

Es sieht so aus, als ob es sich nicht nur um diese Linie handelt. Ich werde noch ein bisschen tanzen müssen, damit der krumme Metatrader richtig funktioniert...

D.h. in meinem Beispiel hat es gut funktioniert, aber im echten Programm nicht((

Vielleicht ist mein Tamburin nicht groß genug?
Grund der Beschwerde: