エキスパートアドバイザー - 雑多な質問 - ページ 12

 
Marco vd Heijden:

そうですね。

微妙に違うトホホ。

グローバルかスタティックかというのは、どちらでもないですね。しかし、あなたのリセットの方法は良いですね。オーバーランを防げます。
 
honest_knave:
グローバルかスタティックかは、ここでもそこでもありません。しかし、あなたのリセット方法は優れています。オーバーランを防ぐことができます。

早とちりでした。あなたのは逆方向のオーバーランです。後でCTRLを押すと発動します。チャートをクリックしてからCTRLを押せば発動します。

 

@honest_knave- コメントありがとうございます。多くのことを感謝 - しかし、私は最初の@マルコvd Heijdenの コメントを試して開始しました。( それについては、あなたのコメントをすべて読みました。)

Marco vd Heijden- ありがとう男。

しかし、私は私が何か間違っていると思う、多分私はより明確に理解していない。とにかく私は試してみました、あなたは以下のコードを見つけることができます。
私の間違いはどこにありますか、お願いします。

//+------------------------------------------------------------------+
//|                                                      keydown.mq4 |
//|      Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

string prefix = "Custom Expert |";
string lotedit = prefix + "Edit Name";
string lotbtnplus = prefix + "Lot button Plus";
string lotbtnminus = prefix + "Lot button Minus";

double lot = 0.01, lotstep = 0.01 ;
bool ctrl_click;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
   EventSetTimer(60);

   graphicsObj();

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
    EventKillTimer();
    ObjectsDeleteAll( 0, prefix );
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
    graphicsObj();
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

    if( id == CHARTEVENT_CLICK )
    {
        if ( sparam == lotbtnplus )
        {
            ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
            lot = lot + lotstep;
            update();

            Print( " | lot plus :  ", lot );
            return;
        }

        Print( "Click" );
        ctrl_click = 1;
    }

    if( id == CHARTEVENT_KEYDOWN )
    {
        //Print(lparam);// print to identify keycode

        if( lparam == 17 )  // ctrl key
        {
            if( ctrl_click == 1 )// if mouse click
            {
                //Do Something when CTRL (keycode 17) is pressed
                if ( sparam == lotbtnplus )
                {
                    ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
                    lot = lot + ( lotstep * 10 );
                    Print( " | lot plus + Ctrl initial:  ", lot );
                    update();

                    Print( " | lot plus + Ctrl:  ", lot );
                    return;
                }
                Print( "Ctrl + Click" );
                ctrl_click = 0;  // reset
            }
        }
        ctrl_click = 0; // reset if not ctrl
    }
}

//|+--------------------------------------------------------------------------------+
//| -   Function Update                                                             |
//|+--------------------------------------------------------------------------------+
void update()
{
    //---
    ObjectSetString( 0, lotedit, OBJPROP_TEXT, DoubleToString( lot, 2 ) );
    //---
    return;
}
void graphicsObj()
{
    ObjectCreate(0, lotedit, OBJ_EDIT, 0,0,0);
    ObjectSetInteger(0, lotedit, OBJPROP_XDISTANCE, 30);
    ObjectSetInteger(0, lotedit, OBJPROP_YDISTANCE, 30);
    ObjectSetInteger(0, lotedit, OBJPROP_XSIZE, 60);
    ObjectSetInteger(0, lotedit, OBJPROP_YSIZE, 30);
    ObjectSetString(0, lotedit, OBJPROP_TEXT, DoubleToString( lot, 2 ));

    ObjectCreate( 0, lotbtnplus, OBJ_BUTTON, 0, 0, 0);
    ObjectSetString( 0, lotbtnplus, OBJPROP_TEXT, "+");
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_XDISTANCE, 100);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_YDISTANCE, 30);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_XSIZE, 70);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_YSIZE, 30);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_BACK, false);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_SELECTABLE, false);
}
 

最初の問題は、CHARTEVENT_CLICK がCHARTEVENT_OBJECT_CLICK と同じでないことです。チャート上の任意のクリックではなく、オブジェクト上のクリックをキャッチしたいのです。

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

//    if( id == CHARTEVENT_CLICK )
    if( id == CHARTEVENT_OBJECT_CLICK )
 
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   static bool wasCTRL=false;
   if(id==CHARTEVENT_OBJECT_CLICK && sparam == lotbtnplus)
     {
      ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
      lot+=(wasCTRL)?lotstep*10:lotstep;
      update();
      Print( " | lot plus :  ", lot );
      return;
     }
   wasCTRL=(id==CHARTEVENT_KEYDOWN && lparam==17);
}
これは役に立つかもしれません。CTRLの後にボタンを押す速さによっては、マウスの2回目のクリックで0.1までしか上がらないことがあるかもしれません。
 
honest_knave:
これは役に立つかもしれません。CTRL の後にボタンを押す速さによっては、マウスの 2 回目のクリックで 0.1 にしかならないことがあるかもしれません。

#Ctrl + マウスボタン - 終了

うわー、まさにその通り、すごい大感謝です。

Honest_knaveと Marco vd Heijdenに 感謝します。

 
#スプレッド・シート - オープン

最新金曜日の' Spreadsheet'はOnTick関数によって更新されました(これは私が必要とするもので、私にとっては良いものでした)。

(MT4プラットフォームが2回アップデートされました。) その後、このスプレッドシートがチャートに反映されません。

また、スプレッドシートの上にBidとAskの価格を表示していますが、BidとAskは正常に動作していますが、スプレッドシートは正常に動作していません。

そこで、ラベルオブジェクトに Label Functionを使用していますが、どのラベルオブジェクトも'Spreadsheet'がなくても正常に動作します。また、関数なしでスプレッドシートのラベルオブジェクトを作成した場合、正常に動作することをお知らせする必要があります。
この問題は、MT4プラットフォームのアップグレード後に発生します。

もし、私の心配を理解していただけるなら、どのようにこの問題を解決できるか教えてください。
よろしくお願いします。

 

表計算 ソフトのコードをお持ちでしたか?

 
Marco vd Heijden:

表計算ソフトのコードをお持ちでしたか?

私はまだそれについて研究しています。また、私は近いうちに、そこから動作しているコードと動作していないコードのいくつかを投稿します。
 

ラベル 関数を2つ作成することはできますか?
(例:1つはテキスト用、2つはテキストとフォントサイズ 用。)