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

 
hoz:

Vadimさん、私ならあなたのおっしゃるとおりにしますよ!(笑)。だから質問したんです。何か配慮が足りなかったのかもしれないと思いました。今も自分のロジックと他のプログラマーのロジックを観察しています。基本的なロジックに加え、さまざまな要素を考慮する必要があることがわかったからです。

RefreshRates()はエキスパートスレッドで履歴を更新する。 MarketInfo()はサーバからデータを取得する。リフレッシュする必要はありません。不要なブレーキになってしまうのです。

更新が必要な場合、RefreshRates()を呼び出すだけでは、何も得られません。全歴史の到来というイベントをどうにかしてコントロールし、処理しなければならない。

 
メタエディタの使い方を教えてください。
 
crespo1985:
こんにちは、メタエディタの使用方法について教えてください。 。


さて、こんにちは。好きなように使ってくださいここはそういう質問をする場所ではないのですが...。ここはプログラマーのためのフォーラムなのに...。

ずん子:

RefreshRates() は Expert Advisor のスレッドで履歴を更新する。 MarketInfo() はサーバからデータを取得する。更新の必要はありません。不必要なブレーキです。

更新が必要な場合、RefreshRates()を呼び出すだけでは何もできない。私たちは、すべての履歴イベントを何らかの方法で制御し、処理しなければなりません。

RefreshRates()でマーケットデータ(現在までの 履歴)を更新し、マーケット環境変数には最後に受信した値が使用されることは理解しています。私が理解する限り、これは唯一の論理的なバリエーションです。ですから、この機能はより簡単に、より速く、より論理的に、より実用的に書かれており、より信頼性が高いのではないでしょうか?

double fGet_TradePrice(int fi_price,    // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
}
 
hoz:

はい、RefreshRates()でマーケットデータ(その履歴から現在の時刻まで)を更新し、マーケット環境変数が最後に受信した値を使用することは理解しています。私が理解する限り、これは唯一の論理的なバリエーションです。したがって、この機能は、より簡単に、より速く、より論理的に、より実用的で信頼できるように書かれるのでしょう?

私ならこうします。

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

履歴を更新するための関数を別途作成する必要があります。

 

2時間かけてテストピースを作成し、さまざまな条件をさらに検証しています。

効かない!?

エラーを教えてください。

int mm;


if (mm==0) { B=Bid; mm=1;} 

OrderSelect(0,SELECT_BY_POS,MODE_TRADES); 

if ( (Bid> B+0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_SELL) ) { My_close(); My_buy (); My_modify(); }  

if ( (Bid< B-0.0002 ) && (OrdersTotal()==0 || OrderType()==OP_BUY ) ) {My_close(); My_sell (); My_modify(); }
  

ポイントは、2pp以降に自分の方向性で注文が開くことです。

は売れ残り...

 

ごきげんよう。つまらないことですが、お許しください。セリフはロボットのもので、何年も前から持っているのですが、基本的にこの種のサイクルは、必ずどちらか一方をさまたげるのです。

 for(int i=OrdersTotal()-1;i>=0;i--) 
      {  if(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)

注文の合計がマイナス1になっているのはなぜですか?ループが変数andの減少を狙うというのは本当でしょうか?

 

Kimの関数では、timeパラメータ="1970年以降の日付と時刻(秒"

2種類のバリエーションを試しました。

と、どちらも現在の利益ではなく、全歴史の利益を出している......。

int t=(     TimeCurrent()-( (Hour()*3600) +(Minute()*60)+Seconds()   ) ); 
int t=(    (Hour()*3600) +(Minute()*60)+Seconds()    ); 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 
Dimka-novitsek:

ごきげんよう。つまらないことですが、お許しください。セリフはロボットのもので、何年も前から持っているのですが、基本的にこの種のサイクルは、必ずどちらか一方をさまたげるのです。

注文の合計がマイナス1になっているのはなぜですか?ループが変数andの減少を狙うというのは本当でしょうか?

ループは0からTotal-1まで、またはTotal-1から0までのインデックスを数えます。そのため、マイナス記号またはより小さい記号<が必要です。
 
Zhunko:

私ならそうします。

double TradePrice(int    nPriceId, // Цена: 0 - Bid; 1 - Ask
                  string sSymbol)  // валютная пара
 {
  switch (nPriceId)
   {
    case 0: return(MarketInfo(sSymbol, MODE_BID));
    case 1: return(MarketInfo(sSymbol, MODE_ASK));
    default: Print("Ошибка и прочее...");
   }
  return(0);
 }

このウィンドウツールでもMarketInfo()でデータを受信するのは、リソース的に高すぎると思いませんか?

ずん子:

履歴を更新するための関数を別に書く必要があります。


別の関数を書くという理屈がよくわからない。RefreshRates() 関数自体は、あらかじめ定義された変数の データを更新するものである。また、Bidと Askは あらかじめ定義された変数である。RefreshRates() 関数が定義済みの変数を更新するのであれば、なぜ追加の関数を書くのですか?
 
ありがとうございます!!!