受注サイクルの整理 - ページ 8

 
Alexey Viktorov:

そんな複雑な話だったっけ?DCはスプレッドと手数料で儲け、プログラマーはコードを書いて儲ける。

あるトレーダーは、スプレッドと手数料を節約しよう(なるべく払わない)と言っています。

相手のトレーダーは、「お金のためにコードを書くのは卑怯だ(できればお金を払わない)」と言っています。

二人とも自分の財布は自分で管理する。それぞれ違いはないようですが...。

プログラマーであるあなただけが、前者を支持し、後者は間違っていると証明して反論しているのです。

もっと安いプログラマを探したいトレーダーの気持ちもわかります。また、より良い取引条件を求めるトレーダーも理解できます。何が問題なのか?お金を貯めたいと思うことの何がいけないのでしょうか。

しかし、ここでは話が別です。注文に対してより効果的に働くようなアルゴリズムを自分で考え、それによってシステムの利益を上げること、それが優れた開発者であることを意味します。私の考えでは、数pipsを無視できるのは、アイデアの大まかなテストの段階だけです。

 
Andrey Khatimlianskii:

もっと安いプログラマを探したいというトレーダーの気持ちもわかります。また、より良い取引条件を求めるトレーダーも理解できます。何が問題なのか?お金を貯めたいと思うことの何がいけないのでしょうか。

しかし、ここでは話が別です。注文に対してより効果的に働くようなアルゴリズムを自分で考え、それによってシステムの利益を上げること、それが優れた開発者であることを意味します。数pipsをおろそかにできるのは、アイデアを大まかに検証している段階だけだと思います。

ファインそして、もっと無料で書きたいという消極的な気持ちも、なぜかよくわかります。こちらも問題なし...。

一般的に、私はお金を節約しようとすることに反対はしませんが、狂気とまではいきません。取引の頭でスプレッドに貯金をつけるのは無理がある...。

 
Alexey Viktorov:

一般的に節約を心がけるのは構わないが、非常識とまではいかない。スプレッドの節約を取引の中心に据えてはいけない...。

計算すれば、そんなにおかしなことではないんです。でも、説得するつもりはありません。

 
Andrey Khatimlianskii:

計算すれば、そんな馬鹿なことはない。でも、説得するつもりはありません。

コストではなく、利益を計算しなければならない。

コストを節約すれば、赤字になるのは簡単なことです。もし、TSが経費を負担するように設計されていても、利益が出るのであれば、これは良いTSであり、違うシナリオでは、損失を出すかもしれないからです。

実は、入賞者の審査はありません!(笑

 

7ページ目から現在のページは別のトピックに移動して(「さらなる議論はこちら」みたいなリンクでもいい)、このスレッドで作られたものを続けることはできないのでしょうか?

 
Vitaly Muzichenko:

コストではなく、利益を計算しなければならない。

コストを節約すると、赤字になりやすい。TSが経費がかかるように設計されているが、同時に収入も得られるのであれば、別のシナリオでは赤字になるかもしれないので、良いTSであると言える。

そして、一般的に勝者は判断されない!

このコメントの意味がわからない。

超高収益ストラテジーの手数料の大きさは重要でないということでしょうか。

 
MT4 EURUSDで以下のExpert Advisorを動かしてみましょう。
// В случае изменения количества ордеров по основному символу, сигнализирует об их количестве

// #include <MT4Orders.mqh>

const bool Init =  EventSetMillisecondTimer(1);

int AmountOrders( const string &Symb )
{
  int Res = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb))
      Res++;
      
  return(Res);
}

void OnTimer()
{
  static int PrevAmount = 0;
  
  const int Amount = AmountOrders(_Symbol);
  
  if (Amount != PrevAmount)
  {
    PrevAmount = Amount;
    
    Alert(Amount);
  }    
}


EURUSDとUSDJPYの注文をランダムに5つずつ出してみましょう。さて、AmountOrdersの無難なコードを見て、次のようなシナリオを想像してみましょう。

  1. 実行時にi==3のAmountOrdersになっている。
  2. USDJPYのポジションを決済 します。オーダーは、現在のオーダーのテーブルで振られます。
  3. i == 2のとき、OrderSelectによってポイント1と同じオーダーに遭遇することがある。このため、AmountOrdersは実際より1つ多い値を返すことがあります。


以下は、その確認です。

#property strict

void OnStart()
{
  for (int i = 0; i < 5; i++)
    OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
    
  int PrevTicket = 0;
  
  for (int i = OrdersTotal() - 1; i > 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      const int Ticket = OrderTicket();
      
      if (Ticket == PrevTicket)
        Alert("Hello World!");
        
      PrevTicket = Ticket;
      
      if (OrderSelect(i - 1, SELECT_BY_POS))      
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    }
}


結果

2017.10.06 01:28:05.885 TestTets EURUSD,M1: close #240725107  buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10.06 01:28:05.775 TestTets EURUSD,M1: Alert: Hello World!
2017.10.06 01:28:05.775 TestTets EURUSD,M1: close #240725108  buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10.06 01:28:05.673 TestTets EURUSD,M1: Alert: Hello World!
2017.10.06 01:28:05.673 TestTets EURUSD,M1: close #240725110  buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10.06 01:28:05.578 TestTets EURUSD,M1: Alert: Hello World!
2017.10.06 01:28:05.578 TestTets EURUSD,M1: close #240725111  buy 1.00 EURUSD at 1.17121 at price 1.17099
2017.10.06 01:28:05.480 TestTets EURUSD,M1: open #240725112  buy 1.00 EURUSD at 1.17121 ok
2017.10.06 01:28:05.343 TestTets EURUSD,M1: open #240725111  buy 1.00 EURUSD at 1.17121 ok
2017.10.06 01:28:05.253 TestTets EURUSD,M1: open #240725110  buy 1.00 EURUSD at 1.17121 ok
2017.10.06 01:28:05.138 TestTets EURUSD,M1: open #240725108  buy 1.00 EURUSD at 1.17121 ok
2017.10.06 01:28:05.035 TestTets EURUSD,M1: open #240725107  buy 1.00 EURUSD at 1.17121 ok


オーダーカウントの無害なループで同じチケットが2回出るかもしれないのです

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
fxsaber:

何の変哲もないオーダーカウントのサイクルで、同じチケットが2回出てしまうこともあるのです

疑問を解消するために、次のことを行ってください。

Expert Advisorのインストール

// Советник будет алертовать, если OrderSelect соседних индексов выберет один и тот же ордер
const bool Init =  EventSetMillisecondTimer(1);

void OnTimer()
{
  int PrevTicket = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      const int Ticket = OrderTicket();
      
      if (Ticket == PrevTicket)
        Alert("Hello World!");
        
      PrevTicket = Ticket;
      
      Sleep(1); // 1 миллисекунда - это много или мало?
    }
}


スクリプトの起動

#property strict

void OnStart()
{
  // Открыли позиции
  for (int i = 0; i < 25; i++)
    OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0);

  int Tickets[];
  const int Total = OrdersTotal();
  
  ArrayResize(Tickets, Total);
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS))
      Tickets[i] = OrderTicket();
    
  // Закрыли позиции
  for (int i = 0; i < Total; i++)
    OrderClose(Tickets[i], 1, SymbolInfoDouble(_Symbol, SYMBOL_BID), 100);
}


そして、EAが異なる指標で同じ注文を選択していることを確認します。そして、これは取引ロジックを完全に失敗させることにつながります。

 
fxsaber:

EAが異なる指標で同じ注文を選択した場合。そしてそれは、取引ロジックを完全に崩壊させることにつながるのです。

ということで、本題の全体像です!注文のループをどのようにアレンジするか?例えば、このような関数を正しく書くにはどうしたらよいのでしょうか。

// Возращает количество ордеров данного символа
int AmountOrders( const string &Symb )
{
  int Res = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb))
      Res++;
      
  return(Res);
}


このスレッドは、検索サイクルが一時停止したときに、いくつかの繰り返し動作が必要であることを指定することから始まりました。ここでは、1ミリ秒程度の休止で効果を確認することができます。

ここまではそんな松葉づえ。

bool IsChange( const bool InitFlag = false )
{
  static int PrevTotal = 0;
  static int PrevHistoryTotal = 0;
  
  const int Total = OrdersTotal();
  const int HistoryTotal = OrdersHistoryTotal();    
  
  if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal;    
  }
  
  return(!InitFlag && ((Total != PrevTotal) || (HistoryTotal != PrevHistoryTotal)));
}

// Возращает количество ордеров данного символа
int AmountOrders( const string &Symb )
{
  int Res = 0;
  
  IsChange(true);
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (IsChange())
    {
      i = OrdersTotal();
      
      Res = 0;
    }
    else if (OrderSelect(i, SELECT_BY_POS) && (OrderSymbol() == Symb))
      Res++;
      
  return(Res);
}

しかし、常に正しく動作するという確証はありません。

 
fxsaber:

疑問を解消するために、次のことを行ってください。

Expert Advisorのインストール

スクリプトの実行

そして、EAが異なる指標で同じ注文を選択していることを確認します。そして、これは取引ロジックを完全に失敗させることにつながります。

変更しました

// Советник будет алертовать, если OrderSelect соседних индексов выберет один и тот же ордер
const bool Init =  EventSetMillisecondTimer(1);

bool IsChange( const bool InitFlag = false )
{
  static int PrevTotal = 0;
  static int PrevHistoryTotal = 0;
  
  const int Total = OrdersTotal();
  const int HistoryTotal = OrdersHistoryTotal();    
  
  if (InitFlag)
  {
    PrevTotal = Total;
    PrevHistoryTotal = HistoryTotal;    
  }
  
  return(!InitFlag && ((Total != PrevTotal) || (HistoryTotal != PrevHistoryTotal)));
}

void OnTimer()
{
  int PrevTicket = 0;
  
  IsChange(true);
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (IsChange())
    {
      i = OrdersTotal();
      
      PrevTicket = 0;
    }
    
    else if (OrderSelect(i, SELECT_BY_POS))
    {
      const int Ticket = OrderTicket();
      
      if (Ticket == PrevTicket)
        Alert("Hello World!");
        
      PrevTicket = Ticket;
      
      Sleep(1); // 1 миллисекунда - это много или мало?
    }
}

アラートが出ないようにスクリプトを変更しました。