MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1800

 

マッシュキャッツの 標準MTアドバイザーのDecreaseFactorは何ですか?

lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
 
Nerd Trader #:

不思議なことに、ボタンがあるようになったんです。そしてコードの乱雑さ、草案だからです。とにかく、すでに動作するバージョンを作って、最後に残ったのはボタンの削除ですが、ここでまたこのくだりが始まりました。

ボタンをクリックすると、すべての線が作成されます。

ボタンが押されたら-削除

なんて、くだらないことが書かれていますね。

 
Artyom Trishkin #:

また、イベントを見る必要はありません。テスターでは全く動作しない。ステータスを見なければならない。

もちろん謙遜ではなく、一度でも私のヒントを聞いていれば、とっくに全部できていたはずです。ちゃんと、マルチの松葉杖なしで。

しかし、誰もが飛び込みたい 奈落を選んでいる。

Mihail Matkovskij(ミハイル・マトコフスキー #:

テスターでデバッグを使うには、MQL5で書くことを覚えましょう。そこではすべてがうまくいく。

オブジェクトの名前を変えるということはありません。既存のモノを新しいモノに置き換える、と考えてください。

そんなはずはない。あなたのコードは、まるでごちゃごちゃしているように見えます。そのため、ボタンにラグが発生しているのだと思われます。先ほども言ったように、まずは簡単なものから始めてみてください。物事を複雑にしすぎないこと。そして、シンプルなものがうまくいき始め、それに自信が持てるようになったら、徐々に複雑にしていく。

また、イベント(クリック)によるトリガーの場合、どのように状態を確認すればよいのでしょうか。そうなんだけど、mql4で書いてるんだから、「デバッグが効くc#で書けるようになれ」って言ってるのと同じなんだよね。

"正しく、多層式松葉杖なしで。" -だから、オブジェクトを隠すことは、ただの松葉づえだ。

すべて私が行ったことで、すべてが動作しますhttps://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
ボタンをクリックすると、すべての行が一度に作成され、その後、ボタンパネルの位置によって、隠され、1つだけ残されます。価格に対するカーソルの位置によって、さらに線が隠されたり表示されたりします。

追伸

もし、曲がったmql4がなければ、オブジェクトを隠すという無意味なことを思いつく必要はなかったでしょうし、オブジェクトの削除や名前の変更ですべてが最初からうまくいくはずでした。

stop order button (public).mq4
stop order button (public).mq4
  • gist.github.com
GitHub Gist: instantly share code, notes, and snippets.
 
Nerd Trader #:

また、イベント(クリック)によって引き起こされる場合は、どのように状態を確認するのですか?でも、私はmql4で書いているので、「デバッグが効くc#で書けるようになりなさい」と言っているのと同じです。

"正しく、多層式松葉杖なしで。"モノ "を隠すのは、ただの "姥 捨て "なんですね。

すべて私が行ったことで、すべてが動作しますhttps://gist.github.com/satorkain/0cf7a8df8ec1f4b3191defd04c94a418
ボタンをクリックすると、すべての行が一度に作成され、その後、ボタンパネルの場所によって、隠され、1つだけ残ります。価格に対するカーソルの位置によって、さらに線が隠されたり表示されたりします。

追伸

もし、曲がったmql4が なかったら、オブジェクトを隠すなんて無意味なことを思いつく必要はなかったし、オブジェクトの削除や名前の変更も同様にすべてが最初からうまくいくはずだったのです。

オブジェクトを隠すという のは、あくまで開発者が推奨する方法です。そして、そのための特別なプロパティがあるのです。状態を見るには、ボタンの「State」プロパティを見る必要があります。

開発者が推奨する手段を松葉杖とし、常に貪欲にオブジェクトを作成/削除することを純粋なコードとみなしていますが、これこそまさに松葉杖であり、推奨される高速な方法を回避していることに他なりません

ところで、あるオブジェクトを素早く他のオブジェクトの上に置くには、それを不可視にして、すぐに可視化する必要があります。これは、オブジェクトリストでの位置を上書きし、一番上に置くことになります。

ZS. しかも、そこでもgit上ではC-minusでコードを公開していましたね。まったくもってエラーになりやすい。たった一本の線が作られないだけで、すべてが崩れてしまう。それはすぐにわかりました。イベントハンドラで行を作るのは、何のためですか?OnInit()は何のために必要なのですか?作成し、成功を確認し、フラグを設定し、非表示にしました。OnDeinit()では、プログラムによって作成されたオブジェクトを削除しています。その際、名前のプレフィックスも必要です。

イベントハンドラで表示と非表示を切り替えるだけで、ビルは存在しないはずです。あなたの場合は......その通りです。

そんなものをgitで公開するのは恥ずかしい。でも、それは自分のためなんです。

あなたはどうですか?それを利用する人がいてもいいのでしょうか?

 
Artyom Trishkin #:

オブジェクトを隠すという のは、まさに開発者が推奨する方法です。そして、そのための特別なプロパティがあるのです。状態を見るには、ボタンの「State」プロパティを見る必要があります。

開発者が推奨する手段を松葉杖とし、常に貪欲にオブジェクトを作成/削除することを純粋なコードとみなしていますが、それこそ推奨される迅速な方法を回避するための松葉杖なのです

ところで、あるオブジェクトを素早く他のオブジェクトの上に置くには、それを不可視にし、すぐに可視化する必要があります。

ZS. しかも、そこでもgit上ではC-minusでコードを公開していましたね。まったくもってエラーになりやすい。一本の線が出来 なくなると、全体が崩れてしまうのです。それはすぐにわかりました。イベントハンドラで行を作るのは、何のためですか? OnInit()は何のために必要なのですか?作成し、成功を確認し、フラグを立て、非表示に するのです。OnDeinit()では、プログラムによって作成されたオブジェクトを削除しています。その際、名前のプレフィックスも必要です。

イベントハンドラで表示と非表示を切り替えるだけで、ビルは存在しないはずです。あなたの場合は......その通りです。

そんなものをgitで公開するのは恥ずかしい。でも、それは自分のためなんです。

あなたはどうですか?それを利用する人がいてもいいのでしょうか?

4つのラインのうち、必要に応じて1つのラインを作成することに貪欲?:)200行あったらどうする?あなたのロジックで一度に作ると経済的なのでしょうか?そして、それがどのように考案されたかは、開発者だけが知っており、非常に直感的でない方法で考案されたものです。まるで、信じられないような、非論理的なことは何も必要ないかのように。どうして、この方法でしかモノを扱ってはいけない、他の方法ではいけないとわかったのでしょう。mql4の教科書からかな?この点については、そこで説明されているかどうか疑問です。

少なくとも、意図したとおりに動作している :)タイトルの括弧内(公開)なので、まだ完全ではありませんが、そうですね、オブジェクトを作成するチェックがないですね、修正しましょう。 そして ペーストビンを思い出せなかったので、gitにだけ 投稿しました。 恥ずかしい?Gitは、人々が 学び、経験を交換 し、コードを 共有 するために作られたもので、動いているかどうかに違いはありません。

ここで、250のオブジェクトが作成され、Expert Advisorの期間中、メモリに保存されています。な るほど、なるほど 、ありがとうございます。 直感的でない論理」とはこういうことです。例えば、OnInit()に関するチュートリアルでは、Expert Advisor/Indicatorの初期化時に処理されることだけが書かれています。

 
Nerd Trader #:


秘密を教えてあげよう。電卓」でない限り、1,000個以上のオブジェクトを作成することができます。でも、それもできるんです。電卓は4GBのRAMを搭載したコンピュータです。それ以下は「おばあちゃんの計算機」...。:)そのため、オブジェクトを一度に作成することも、1つずつ作成することも可能です。違いはありません。しかし、狂信的なものはない。

そうすれば、賢くやれば何でもうまくいく!...と。

 
Nerd Trader #:

必要に応じて1ライン4本を作成する奔放さ?:)200行あったらどうする?あなたのロジックでは、一度に全部作った方が経済的なのでしょうか?そして、それがどのように考案されたかは、開発者だけが知っており、非常に直感的でない方法で考案されたものです。まるで、信じられないような、非論理的なことは何も必要ないかのように。どうして、この方法でしかモノを扱ってはいけない、他の方法ではいけないとわかったのでしょう。mql4の教科書からかな?この点については、そこで説明されているかどうか疑問です。

少なくとも、意図したとおりに動作している :)タイトルの括弧内(公開)なので、まだ完全ではありませんが、そうですね、オブジェクトを作成するチェックがないですね、修正しましょう。 そして ペーストビンを思い出せなかったので、gitにだけ 投稿しました。 恥ずかしい?Gitは、人々が 学び、経験を交換 し、コードを 共有 するために作られたもので、動いているかどうかに違いはありません。

ここで、250のオブジェクトが作成され、Expert Advisorの期間中、メモリに保存されています。な るほど、なるほど 、ありがとうございます。 直感的でない論理」とはこういうことです。例えばチュートリアルのOnInit()について、この関数はEA/指標の初期化時に処理されることが書かれていますね。

必要な数だけ、同時にオブジェクトを作成することができます。当時、MTはインジケータバッファの描画があまり発達しておらず、400本のローソク足とトレンドラインを描かなければならず、1本のローソク足に対して5本のライン、400*5=2000、さらに1本ずつオブジェクトが必要、などなどでした。合計で約2500個のオブジェクトを手に入れることができました。くすみもなく効果がありました。

あなたは、モノを扱う論理をよく理解していないが、議論の方法は知っている。その逆をやるのがいいんです。

 
Nerd Trader #:

必要に応じて1ライン4本を作成する奔放さ?:)200行あったらどうする?あなたのロジックでは、一度に全部作った方が経済的なのでしょうか?そして、それがどのように考案されたかは、開発者だけが知っており、非常に直感的でない方法で考案されたものです。まるで、信じられないような、非論理的なことは何も必要ないかのように。どうして、この方法でしかモノを扱ってはいけない、他の方法ではいけないとわかった のでしょう。mql4の教科書からかな?この点については、そこで説明されているかどうか疑問です。

少なくとも、意図したとおりに動作している :)タイトルの括弧内(公開)なので、まだ完成ではありませんが、そうですね、オブジェクトを作成するチェックがないですね、修正しましょう。 そして ペーストビンを思い出せなかったので、gitにだけ 投稿しました。 恥ずかしい?Gitは、人々が 学び、経験を交換 し、コードを 共有 するために作られたもので、動いているかどうかに違いはありません。

ここで、250のオブジェクトが作成され、Expert Advisorの期間中、メモリに保存されています。な るほど、なるほど 、ありがとうございます。 直感的でない論理」とはこういうことです。チュートリアルにあるOnInit()などは、Expert Advisor/Indicatorの初期化時に処理される関数ということしか書かれていません。

ようこそ。簡単なロシア語で説明することにします。

あなたは釣りに行くのです。

  1. 家では、パントリーを開けて、頭をかいて、閉じます。
  2. 釣りに行って、釣竿が必要なんですね。
  3. 釣竿を取りに物置に帰ります。
  4. 釣りに行って、釣竿を入れて魚を釣った、網が欲しい
  5. ネットのために物置に帰宅
  6. 釣りに行き、釣った魚を網で釣り針に浮かせ、釣った魚を保存するための容器が必要だったこと
  7. のために家に帰る。続けますか?

あるいは、パントリーから必要なものをそのまま取り出し(OnInit)、走り回らずに釣りをし、帰宅したらパントリーや冷蔵庫にすべて入れる(OnDeinit)ことも可能です。

この 掲示板でご存知の方も多いかもしれませんね。時には耳を傾けて、言われたことを聞くだけでいい。

そうでなければ、質問を受けて、答えを得て、「うそつき」と言って、思ったとおりに行動する。

まずはじっくりと考え、質問し、編集に取りかかることです。

プログラミングで一番シンプルなのは、コードを印刷することだということをご存知ですか?そして、開発の獅子奮迅の活躍は、ロジックを考えることです。

 

2回目の話題で恐縮です。

しかし、まだ解決できない問題があります。

同一ローソク足で連続注文を出すこと。

同じローソク足でEAが新規注文を出すのを防ぎたいのですが。

Sleep() で解決しようかと思いましたが、Makarは処理を止めない方がいいと言いました。

の問題を解決します。

これで、コードは次のようになります。

// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 30;     // Уровень убытка
input int     TakeProfit    = 30;     // Уровень прибыли
input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input double  K_Martin1     = 2.0;    // Множитель мартин 1
input double  K_Martin2     = 2.0;    // Множитель мартин 2
input double  K_Martin3     = 2.0;    // Множитель мартин 3
input int     OrdersClose   = 5;      // Ограничение лотности мартин1
input int     OrdersClose2  = 5;      // Ограничение лотности мартин2
input int     DigitsLot     = 2;      // Точность лотности
// Параметры индикатора
input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
string AC;
datetime Start;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
MaxMartinLot   = Lot*MathPow(1.4,OrdersClose);
MaxMartinLot2  = Lot*MathPow(K_Martin2,OrdersClose2);
AC             = StringConcatenate(" ", AccountCurrency());
return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
// Тикет ордера
   int iOTi = 0;   

   iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
// Тикет ордера  
   int iOTi = 0;   
//Print(bCheckOrders());
   iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);

// Проверим открылся ли ордер
   if(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
      vOrderModify(iOTi);
   else
// Если нет, то получим ошибку
      vError(GetLastError());
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+-----------------------------------------------------------------------------------------------+
double LOT()
{
   int n=0;
   int m=0;
   int v=0;
   double OL=Lot;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderProfit()>0) 
            {

               if (n==0) OL=NormalizeDouble(OrderLots()+K_Martin1,DigitsLot);
               n++;
               
               if ((OL>=MaxMartinLot)&& (m==0)) OL=NormalizeDouble(OrderLots()*K_Martin2,DigitsLot);
               m++;
               
               if ((OL>=MaxMartinLot2) && (v==0)) OL=NormalizeDouble(OrderLots()*K_Martin3,DigitsLot);
               v++;
            }
            else
            {
               if (n==0) {return(Lot);}
               else {return(OL);}
            }
         }
      }
   }
   
   return(OL);
}
 
законопослушный гражданин #:

同じローソク足で新規注文ができないようにしたいのですが。

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  if (time != cTime)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }