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

 
giannis1386:

完全に混乱しています。

double blevel=OrderStopLoss()<Bid-Point*TS; works for me.SLは利益だけを考えて価格を追求する。

double slevel=OrderStopLoss()>Ask+Point*TS; これをelseに追加 する方法がわからない。

boolではありません。

boolではなく、暗黙の変換と呼ばれるものです

ところで、あなたは何をしているのですか?トロール?

 
Artyom Trishkin:

boolではありませんが、暗黙の変換ということで

ところで、あなたは何をしているのですか?トロール?

元のスクリプトは、注文が利益に達したときに閉じるだけでした。
 
giannis1386:
はい、トロールを作ろうとしました。元のスクリプトは、注文の利益に達したときに閉じるだけでした。
スクリプトではなく、EA。プログラムの種類を混同しているのでは?スクリプトはチャート上にロードされた後一度だけ実行され、その後削除されます。ループしていない場合。誰かがポジションを 閉じるためのループスクリプトを作ることはまずないでしょう。
 
giannis1386:
そうです、トロールを作ろうとしたのです。元のスクリップは、ある注文で利益に達したときに閉じるだけでした

ロジックです。

ループ内で選択された現在の注文の利益が設定値より大きい場合、そのストップロスが計算されたストップロス・トロール・レベルより小さい(買いの場合)/大きい(売りの場合)場合、ストップを新しい値にシフトさせる。

これは一言で言えば

 
Artyom Trishkin:
それは私が提案したことではありませんか?

ええ、まあ...あまりに不用意にコードを見たので、全く見なかったと言った方が良いくらいです。でも、それが半分くらいで、あとは恥ずかしくなるくらいくだらないことを言ってしまっている。なぜか突然、ArrayMaximum() が構造体の配列、あるいはこの配列の別のフィールドに適用されるかもしれないという、おかしな考えが浮かんだのです。

私は後悔しています、私は他の人にそう思うことを助言しません、それはうまくいきません...:)

 
Alexey Viktorov:

ええ、まあ...あまりに不用意にコードを見たので、全く見なかったと言った方が良いくらいです。でも、それが半分くらいで、あとは恥ずかしくなるくらいくだらないことを言ってしまっている。なぜか突然、ArrayMaximum()を構造体の配列、あるいはこの配列の別のフィールドに適用することができる、というおかしなアイデアが浮かんだのです。

私は後悔しています、私は他の人にそう思うことを助言しません、それはうまくいきません...:)

まあ...そして私はというと、同じようにあなたのコードに目を通して、あなたに感謝しました。

要するに-どちらも冗談の価値がある...。

 
Artyom Trishkin:
スクリプトではなく、Expert Advisorです。プログラムの種類を混同しているのでは?スクリプトはチャート上にロードされた後一度だけ実行され、その後削除されます。ループしていない場合。ポジションを 閉じるためのループスクリプトを作る人はほとんどいないでしょう。

とのことです。

以下は、MT4標準のclose.mq4スクリプトを少し修正したものです。

MetaTraderのThomasScriptsフォルダにファイルを置いて ください。

 
Artyom Trishkin:

まあ...私はというと、あなたのコードをちらっと見ただけで、本当に短くて助かったと頭を下げてしまいました...。

要するに-どちらも冗談の価値がある...。

いや、納得できない。このコード

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

動作確認済みです。単純なユーザー定義のダブル配列があり、CopyRates()は構造体の配列を埋めるので、配列を扱う関数を使用して最大と最小を選択することはできません。

 
giannis1386:

とのことです。

以下は、MT4標準のclose.mq4スクリプトを少し修正したものです。

このファイルをMetaTraderのArchitectureScriptsフォルダ に置きます。

つまり、彼のスクリプトは一度だけ動作します。私がチャート上にスクリプトを置き、スクリプトが動作して(ポジションを閉じて)、アンロードしたのです。

スクリプトは必要ない、EAが必要なのだ。

 
Alexey Viktorov:

いや、そうは思わない。このコード

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

はテスト済みで動作します。ここでは単純なカスタムダブル配列で、CopyRates()は構造体の配列を埋めるので、配列関数を使用して最大値と最小値を選択することはできません。

いやー、私もあなたのコードを超慎重に見ていましたよ。だから......ジョークは私のことなんです。

SZY... しかし、私のコードはHigh/Low/Highest/Lowestの4つの値を返しますが、あなたのコードはHighとLowしか返しませんし、私のコードはデータコピーの成功をチェックします(全てではありませんが)、あなたのはしません...

このように、私のコードでは、必要なデータが完全にコピーされているかどうかをチェックしています。

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)==rangeBars) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+