GLUCK?! マウスクリックのイベントハンドリング!!! - ページ 13

 
sergeev:


いそげ今だけ!!このユニークな商品をダウンロードしてください。

そして、特別にデザインされたバグ、小さな線のブリップがあるバージョンを手に入れることができます。


:))


は解決策があるのでしょうか? 全てに目を通しましたが~まだ思いつきません、バグではありません、行を変えるのは意図的ですが、ぶれます~以前にも問題を書きましたね。

ブレとまでは言いませんが、X軸に沿った線がずれるんです。

 

トレーダーの皆様へ

.chmマニュアルのOrderSendAsync関数の 説明から、クリックに反応するシンプルなボタンの例をコピーしただけですが、私の場合は次のようになります。

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

結論から言うと、時間軸が変わるとトリガーされます。この問題を解決する方法を教えてください。

 
surava:

トレーダーの皆様へ

.chmマニュアルのOrderSendAsync関数の 説明から、クリックに反応するシンプルなボタンの例をコピーしただけですが、私の場合は次のようになります。

結論から言うと、時間軸が変わるとトリガーされます。この問題を解決する方法を教えてください。

標準のOrderSendAsyncの例では、チャート期間の変更に反応しない。これは、何かを失敗したことを意味します。端末の種類、端末のビルド、すべてのコードなど、より詳細な情報が必要です。
 
Karputov Vladimir:
標準のOrderSendAsyncの例では、チャート期間の変更に反応しません。これは、何かを失敗したことを意味します。端末の種類、端末のビルド、コード全体など、より詳細な情報が必要です。

ウラジミールさん、早速のご対応ありがとうございました。

以下は端末の情報です。


以下はそのコードです(取引関数の 仕組みを学び始めたところです)。

#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:

ウラジミールさん、早速のご対応ありがとうございました。

以下は端末の情報です。


以下はそのコードです(取引 機能の仕組みを学び始めたところです)。

一目瞭然 - ながら削除。
 
Karputov Vladimir:
一見すると、削除しながら。
取り外すのに費用はかかりませんが、問題は別のところにあるのは明らかです。私としては - 損切りよりも、時間内にポジションを閉じないと 無限ループに陥るという問題の方が、すぐに気づけないかもしれませんが)。
 

なるほど、何が問題なのかがわかりました。なぜ、ボタンハンドラが行の有無に影響されるのか、このロジックだけ説明してください。

input bool DescriptionModeFull=true;

???

 

このラインだけではなさそうですね。曲がったメタトレーダーがちゃんと動くように、もうちょっと踊らないと...。

つまり、私の例ではうまくいったのに、実際のプログラムではうまくいかなかったということです((

 
surava:

つまり、私の例ではうまくいったのに、実際のプログラムではうまくいかなかったということです((

もしかしたら、どこかにキッカケがあるのかも?そんなことをしても始まらない

 
surava:

このラインだけではなさそうですね。曲がったメタトレーダーがちゃんと動くように、もうちょっと踊らないと...。

つまり、私の例ではうまくいったのに、実際のプログラムではうまくいかなかったということです((

私のタンバリンは大きくないのでしょうか?