[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 409

 
チャートからのリクエストはRefreshRatesではなく、CopyRates ArrayCopySeriesと同様です。CopyRatesは、トレーディング以外の機能で唯一サーバーを動かしています。
 
Zhunko:
チャートを開いて更新すると、新しいデータの要求がサーバーに行く。強欲な証券会社の中には、より強力なサーバーや広いチャネルにお金を使うよりも、自分たちの懐にお金を入れることを好むところもあります。弱いサーバーが「ハングアップ」しないように、端末からのリクエスト数を制限しなければならないのだ。MRCは1日あたり2000件のリクエストしかありません。取引依頼を除けば、自社の商品数にTFの数を掛けたものの10倍は少ない。
まあ、そういうキッチンは避けなければならないのですが。MRCのネガティブな話は初めて聞きました。端末だけなのか、それとも機能もサーバーに対応するのか(取引を除く)、今後が注目される。この質問をサポートにしました(上に書きました、まだ回答はありません)。だけでない場合は、すべての場所に落ち、端末だけであれば、すべての端末のそのタイプの実行されていると、それは引用符を更新するためにサーバーに連絡する不条理出て行く、取引せずに制限を超えます。不十分だと思うのですが、それでもViktorの言うようにトレーディング以外の機能はサーバーにアクセスしません。

ずん子

MQL4では、コードの効率化を支援する機能を搭載しています。例えば、3000行のインジケータは、私のコードではこのようになります。

つまり、インクルードは通常、グローバル変数が 宣言されているコードの最上位に置かれるということが、ライブラリを見ていて、ドキュメントにも書かれているのです。もし、inludesに関数があるのなら、グローバル変数が宣言されている場所には、実際にはその場所に関数があり、代わりに何らかの変数があると考えるのはおかしいと思うのですが、いかがでしょうか。コードの書き方が違うんです。Expert Advisor で使用する変数と外部カスタム変数が一番上に宣言されていれば、誰もその隣に関数を配置しないのです!しかし、機能付きインクルージョンを配置し、それが普通とされているのですね、私の理解では。こ こで一番戸惑うのは、この点です。

論理的とは思えないのですが...

一方、例えば、ある属性の売買シグナルを取得する関数の代わりに、インラインをどこかに配置すれば、論理的で読みやすいものになるはずです。

ずん子

残念ながら、コンパイラは1つのインクルージョンを1つのモジュール内で複数回使用することを許可していません。これは通常、繰り返しのコードを節約するための方法です。

これは小さなことなんですけどね。結局のところ、メインとなる面倒な関数やコード断片はメインコードの外に置いて、インラインで呼び出すというのが本筋なのです。そして、インライン化した関数を関数名で呼び出すと......。そして、この制限を気にする必要はありません。
 

皆さん、こんにちは。

MarketInfo( )、Print( )関数の学習

これらの関数を使った簡単なコードを以下に示します。

テスター、TF60min.

double T ;
int start()
{
 T = MarketInfo("EURUSD",MODE_HIGH); // в глобальную переменную Т запоминаем максимум дневной свечи,который должна возвращать  MarketInfo ( )
Print (" corresponds to ", T );           //
if ( T > iHigh( Symbol (), 0,10))  // если максимум текущей дневной свечи > High свечи N10(ТФ60 мин)
OrderSend(Symbol(),OP_SELL,0.1,Bid,1,0,0,"jfh",123 ); открыть ордер
}                                                                                                                       
return;

ПРОБЛЕМА 1.Ордер не открывается 2.Print() постоянно возвращает 0 ПРИМЕЧАНИЕ. Для открытия ордера - мне нужной сравнивать параметры свечей разных ТФ(60 мин и 1440 мин.) Подскажите пожалуйста как это можно сделать. Спасибо.

 
Integer:
チャートからのリクエストはCopyRates ArrayCopySeriesリクエストのようで、RefreshRatesのものではありません。CopyRatesは、トレーディング以外の機能で唯一サーバーを動かしています。

RefreshRates()をチェックした。このExpert Advisorを例えばEURUSDで実行し、設定に長時間ウィンドウを開いていない別のツールを挿入すると(履歴がないように)、履歴が表示されます。

extern string Tool           = "AUDNZD"; // Имя инструмента.
extern bool   IsRefreshRates = true;     // Флаг включения обновления таймсерий.
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
  string sTool = Tool; // Имя инструмента.
  if (Tool == "") sTool = Symbol();
  while (!IsStopped())
   {
    if (IsRefreshRates) RefreshRates();
    string sComment = StringConcatenate("MarketInfo()\n",
                                        TimeToStr(MarketInfo(sTool, MODE_TIME), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(MarketInfo(sTool, MODE_BID), Digits), "  ", DoubleToStr(MarketInfo(sTool, MODE_ASK), Digits),
                                        "\n\nПредопределенные переменные\n",
                                        TimeToStr(Time[0], TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(Bid, Digits), "  ", DoubleToStr(Ask, Digits),
                                        "\n\nМассивы-таймсерии\n");
    for (int i = 0; i < 10; i++)
     {
      sComment = sComment + StringConcatenate(TimeToStr(iTime(sTool, 0, i), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "  ",
                                              DoubleToStr(iOpen(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iLow(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iHigh(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iClose(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iVolume(sTool, 0, i), 0), "\n");
     }
    Comment(sComment);
    Sleep(300);
   }
 }

そのため、やはりRefreshRates()はサーバーを参照し、履歴を埋める。そのため、歴史の到来をコントロールすることが必要です。

サポートによると、どの機能も直接サーバーを参照することはないそうです。すべてターミナルから実行します:-)。

 
TarasBY:
GetProfitFromDateInCurrency()(original - this is IMPORTANT: I don't know what you might get there in your version) を使用する場合、このように関数が呼び出されるはずです。

で、この関数は、現在の日の初めから決済された注文の利益を返します。

そして、Print()を使って、コード内のすべての愚かなものをキャッチすることができます。


は機能しない。全履歴のトレードで利用可能なすべての利益を表示します。

以下は元の関数で、もちろん何も変えていません。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

以下はそのコール&プリントです。

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );
 
Zhunko:

RefreshRates()をチェックした。このExpert Advisorを例えばEURUSDで実行し、設定に長時間ウィンドウを開いていない別のツールを挿入すると(履歴がないように)、履歴が表示されます。

そのため、やはりRefreshRates()はサーバーを参照し、履歴を埋める。そのため、歴史の到来をコントロールすることが必要です。

サポートによると、どの機能も直接サーバーを参照することはないそうです。だから、すべてターミナルで行うのです :-)


Vadim、私はメジャーと円とのクロスを除いて、どんな商品も開いたことがない端末であなたのスクリプトを実行しました。とにかく、スクリーンショットをご覧ください。

コメントから判断してマーケットデータの配列が空っぽなので何も汲み取れない...。

 
hoz:


Vadim、私はメジャーと円とのクロス以外の商品を開いたことのない端末で、あなたのスクリプトを実行しました。とにかく、スクリーンショットをご覧ください。

コメントから察するに、マーケットデータの配列が空っぽなので、何も汲み取れない...。


そうそう、Expert AdvisorにRefreshRates()だけでなく、MarketInfo()があることにも気がつかなかったそうです。
 
Zhunko:

RefreshRates()をチェックした。このExpert Advisorを例えばEURUSDで実行し、設定に長時間ウィンドウを開いていない他のツールを挿入した場合(履歴がないように)、履歴が表示されます。

そのため、やはりRefreshRates()はサーバーを参照し、履歴を埋める。そのため、歴史の到来をコントロールすることが必要です。

サポートによると、どの機能も直接サーバーを参照することはないそうです。だから、すべてターミナルで行うのです :-)


想像力の高さには感心させられます。マーケットレビューで、データが一部のシンボル(開いていないもの)のみに表示され、すべてのシンボルに表示されないのはなぜですか?RefreshRates()関数は、あるシンボルは更新され、あるシンボルは更新されないということをどのようにして知ったのでしょうか?

純子さん、ぼやぼやしていないで。

 
lottamer:


が動作しない。全履歴の取引で利用可能なすべての利益を出力します。

以下は元の関数で、もちろん何も変えていません。

以下はそのコール&プリントです。

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );

だから、すべてが正しいのです。自分で書くのが億劫な人は、関数を一行ずつ「読んで」仕組みを理解すれば、すべてがうまくいく...。

関数のパラメータがありますね。

iTime (NULL, PERIOD_D1, 0)

は、最終日のバーの開始時刻 です。つまり、現在の日のバーが開かれる前に決済されたすべてのポジションが計算され、合計されます!意味があるのか?だから、要求されるとか、そういう別のハードルを設定する。でも、見るのはあなた次第です。

 
Integer:

そうそう、Expert Advisor には RefreshRates() だけでなく、MarketInfo() があることにも気づいていない。


その他全ての機能


DoubleToStr(iOpen(sTool, 0, i), Digits), ", DoubleToStr(iLow(sTool, 0, i), Digits), ", DoubleToStr(iHigh(sTool.Open), iLow(sTool.Open)), Digits), ", DoubleToStr(iLow(sTool.Open), Digits), Digits)", 0, i), Digits), ", DoubleToStr


(iClose(sTool, 0, i), Digits), ", DoubleToStr(iVolume(sTool, 0, i), 0), "\n") となります。

当然、データは更新されます。