どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 711

 
LBatters:

こんにちは、皆さん)

ポジションの一部を閉じる関数を書こうとしたのですが、テスターで実行すると138がエラーになり、何が問題なのかわかりません。 ヘルプをお願いします。

この関数が動作するはずのEAを以下に示します)

138 - "要求された価格が古いか、入札と売出が混在しています".

開店/閉店価格は 再計算できない、なぜならそこにあるから、ここに問題がある価格を 要求し、MarketInfoを使用して値を与え、これを 別の変数にリネームする必要があります)。

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

皆さん、こんにちは。

キムさんのシンプルなトロールEAを更新して、成行注文を全て決済した後に保留中の注文を削除しようとしているのですが、失敗します(

保留中の注文を削除する機能を追加しました。

私はコーディングがあまり得意ではないので、解決できないはずの別の問題に直面しました。

などの条件を書けばいいのでしょうね。

これはあくまで他のEAでの例です。


よろしくお願いします。

Kostya、必要なタイプの注文 数を計算するループを開始し、その後、好きなように削除してください。
 
_new-rena:
Kostyaさん、必要な種類の注文数を計算するループを作って、あとは好きなように削除してください、知恵を絞ってはいけません。

私はコードオタクです)そこにもっとポーズを追加しました、多分それは役に立つでしょう)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

私はコードオタクです) もう少し間を持たせてみました、多分役に立つと思います)

ハイライトが問題なのではありません。問題は、ポーズを加える前に、"何の得があるのか "を考えるべきだったということです。何もしてくれない...。...そして、それを追加する意味はあるのでしょうか?

私は酔っぱらっていて、キムのコードを尊重しないので、残りを理解できませんでした...すみません...。

 
AlexeyVik:

ハイライトはトラブルではありません。困ったことに、保留中の注文を追加する前に、"何の得があるのか?"と考えるべきだったのです。何もできないよ...。と追加する意味はあるのでしょうか?

そして、私は理解していなかった残りの部分、私は酔っているとキムのコードは尊重しない...申し訳ありません...。

何もない)そう思ったので、条件を書いて今に至る。

はい、コードはそれの本当のためではない)少なくとも無料、有料について私は知らない。

 
7Konstantin7:

何もしていない)そう思ったので、条件を書かないといけない、と思っています。

どうすればいいのかわからないけど、本物のコードとは違うコードで

本物は、証券会社ごとにコードが違うので、世界共通のものはないんです。

 

問題解決)じっくり考えた)皆さんありがとうございました。

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

みなさん、こんにちは。

五目並べで カウンターオーダーをクローズする際の問題に直面しています。要は、トータルで利益が出たときに、例えば買い注文を20枚、売り注文を33枚決済する必要があるんです。そして、関数OrderCloseBy()を使って買い注文20件と売り注文20件を決済し、関数OrderClose()を使って残りの売り注文13件を決済したいのです。

スプレッドが4桁で固定されていれば、スプレッドを閉じる際に問題は発生しませんし、関数OrderCloseBy()を使う際にもスプレッドを保存しています。スプレッドが5桁の場合、スプレッドが浮いているため、総利益に達しても注文が決済されず、OrderCloseBy()関数がログで主張しているのだと思います。同時に、テスターで動かすと、すべて正常に閉まります。

一方向の注文は、利益の合計に達した時点で問題なく決済されます。

このような問題に遭遇した人、そしてそれを解決するための選択肢は何か?

以下は、注文を閉じるための機能です。

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
 

注文を開いた順番に閉じる方法を教えてください。

この機能をやり直したい。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

注文を開いた順番に閉じる方法を教えてください。

この機能をやり直したい。

答えは明白です。オープンポジションを オープンした時間順に並べ替えることができます。そして、ソートされた配列からリストで閉じます。