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

 
Vinin:

本当に歯列矯正を全部しているのですか?ところどころ欠けています。だから、あなたの論理は欠陥があるのです。そして、ほとんどの場合、その結果は期待したものではありません。
Vityaさん、ご無沙汰しています。長い間見なかったね...
 
artmedia70:
Vityaさん、ご無沙汰しています。長い間、会っていない...。


今日は(ほぼ)家にいました。
 
Vinin:

今日は家にいた(ほぼ)。
2週目もあと少しで帰国です :))
 
Vinin:

本当に歯列矯正を全部しているのですか?ところどころ欠けています。だから、あなたの論理は欠陥があるのです。そして、ほとんどの場合、その結果は期待したものではありません。

インジケーターのコードのことでしたら、すべて問題なく、インジケーターは動作し、矢印の形でシグナルを出します(4と5のインジケーターバッファーの買い/売り用)。しかし、Expert Advisorで この矢印をインジケータから 読み取ると、ナンセンスなことになります。Expert Advisorを完全に持ち出さなかったのは、そこでのメインは、シグナルの読み方とそれに対応する操作を理解することだからです。一般的には、信号の読み出しに問題があると言われています。
 
paladin80:

ここに正しくコードを貼り付けるには、まずSRCをクリックし、そこにあるコードをコピーしてください。

もし私が正しく理解していれば、ある瞬間にOP_BUYSTOPとOP_SELLSTOPを1 つずつ 開く必要があるのでしょうか?この時、他に保留中の注文があってもいいのでしょうか?例えば、保留中の注文がありますが、新しい注文を開く前に、古い注文を削除する必要がありますか?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

わかりやすいように汎用コードを貼り付け済みです...。一日の終わりに、可能な限りのポジションと注文をクローズしたかったのですが・・・

、2つの保留注文を開いた 時点(午前中)では、夕方のある時間にすべてクローズしなければならないので、それ以前のオープンオーダーもオープンポジションもありません。私のフルオーダークロージャーは少なくとも正しく表現されているのだろうか =)))



 
artmedia70:

正直、あなたの機能のロジックはわかりません。オブジェクトを削除すべきなのか、構築すべきなのか、それはわかりません。何をさせたいのか言ってくれれば、どこのロジックがおかしいのか分かるはずです。しかし、この関数がグラフィカルオブジェクトを構築しようとしたが失敗した場合、それはすでに存在していることを意味します。では、プログラムのロジックによると次はどうなるのでしょうか?別の名前で新しいオブジェクトを構築することもできますし(例えば、オブジェクト名に現在時刻を追加する(TimeToStr(TimeCurrent()))、すでにオブジェクトを持っているがそのプロパティを変更する必要がある場合、再度構築せずに、単にプロパティを変更するだけでよいのです。そうすれば、エラーは二度と発生しません。

単純なことです。要は、自分が何をしたいのか...ということですね。:)



実は、この機能は単に印刷物の視覚的な代用品であり、すべてを画面に表示するだけなのです。まだあまりうまく書けていませんが、効果はあります。:)そこまでして、書き直します。という問いかけを考えてみるといい。

ところで、新しいオブジェクトを作るのではなく、既存のオブジェクトのプロパティを変更するのであれば、また......ということになりますね。頭が痛くなりそうです。最後のN個の浅瀬を 画面に表示することです。もし、常に最後のオブジェクトを上書きしてしまうと、特定のバグを持つオブジェクトが1つだけになってしまう可能性があります。さらに進んで、ループで必要なだけのオブジェクトを選択して、それだけを書き換えることもできますが、この機能はあくまでもテスト用で、すでにやることが多すぎてあまり飽きないので、その労力は割に合わないかもしれませんね。いつか、その機能のコードを試し、自分の感覚に近づけてから、考えたいと思います

 

という疑問が湧いてきました。次のような実験を書いています。私の場合、当然ながら、あるシグナルをもとに次々と注文を出します。最後の注文が終了したら、他の成行注文や保留中の注文も すべて終了させたいのですが・・・。

もちろん、何でもかんでも配列で書けばいいのですが、普通の方法で書きました。さあ、どうぞ。

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

コンディション

 if (GetLastOrderState() != 0)

最後のオープンオーダーがクローズされたかどうかをチェックします。そして、保留中の注文の削除と成行注文の決済を開始する...。


以下は機能そのものですので、何かが間違っていることは間違いありません(批評やコメントは大歓迎です、むしろ歓迎です :))):

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

インジケーターコードのことなら、括弧で囲めばすべてうまくいき、インジケーターは動作し、矢印の形でシグナルを出します(買い/売り用 - 4および5のインジケーターバッファ)。しかし、Expert Advisorでこの矢印をインジケータから読み取ると、ナンセンスなことになります。Expert Advisorを完全に持ち出さなかったのは、そこでのメインは、シグナルの読み方とそれに対応する操作を理解することだからです。一般的には、信号の読み出しに問題があると言われています。
これはあなたのものです。
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

こうあるべきなのです。
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
こんな感じ。
 
hoz:

実は、この機能は印刷物を視覚的に代用しただけで、すべて画面に表示されるのです。まだ特別にうまくいっているわけではありませんが、うまくいっています...。:)そこまでして、書き直します。という問いかけを考えてみるといい。

ところで、新しいモノを作るのではなく、既存のモノの特性を変えるのであれば、やはり......。それは頭が痛くなりますね。アイデア次第では、最後のNジョイントを 画面に表示させる必要があります。もし、常に一番外側のオブジェクトを上書きしてしまうと、特定のバグを持つオブジェクトが1つだけになってしまう可能性があります。さらに進んで、ループで必要なだけのオブジェクトを選択して、それだけを書き換えることもできますが、この機能はあくまでテスト用で、すでにやることが多すぎてあまり飽きないので、その労力に見合わないかもしれませんね。いつか、その機能のコードを試し、自分の感覚に近づけてから、考えたいと思います

以前、空のインジケータウィンドウにメッセージを表示する関数を作ったことがあります。表示される線の 色を調整することができます。すでにデバッグ済みです。必要であれば共有することもできます。
 
r772ra:
This is yours:こうでなくっちゃ。
こんな感じ。

修正ありがとうございます。しかし、アルゴリズムが正しく動作しませんでした...。