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

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

アートメディア70

ラムスの話に戻りますが、価格が指標線を 越えた時にポジションを閉じることについて。この関数にエラーがあると思います

if(音量[0]>1) return;

チュートリアルで、ティックをカウントする代わりに、バーの出現時にポジションをオープン(クローズ)することができると読みました。可能なのでしょうか?もしそうなら、私の状況に合わせたプログラム方法をヒントとして教えてください。

 
alexey1979621:

アートメディア70

ラムスの話に戻りますが、価格が指標線を越えた時にポジションを閉じることについて。この関数にエラーがあると思います

if(音量[0]>1) return;

チュートリアルで、ティックをカウントする代わりに、バーの出現時にポジションをオープン(クローズ)することができると読みました。可能なのでしょうか?もしそうなら、私の状況に合わせたプログラム方法のヒントを送っていただけないでしょうか。

もしかしたら 役に立つかもしれない。

この関数は、M15に新しいバーが出現したときに真を返す

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

アドバイスお願いします!!!

ある時刻に保留中の注文を書き込んでいる

{

開館時間の定義

}

if ((条件)==true)//
{
OrderSend ( OP_BUYSTOPP, parameters);// 保留の買い逆指値注文を開く
OrderSend ( OP_SELLSTOP, parameters);// 保留の売り逆指値注文を開く
} }.

時間は正しく書いたつもりです。検出はされますが、なぜかSell StopかBuy Stopのどちらかが開き、両方が同時に開くことはないです。異なるタイプの2つの保留注文(BistopとSellstop)を同時に、かつ1つずつ開こうとしています。質問が原始的なようですが、ダミーのためにお助けください(笑)。

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

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

 
artmedia70:
このエラーはグラフィカルなオブジェクトに関するもので、オーダ ではありません。

そのとおりです。エラーはオブジェクトに言及していますが、このEAにはオブジェクトがありません...


borilunad:
ビクターさん、こんばんは。不思議なことに、保留中の注文はオブジェクトではない!?もしかしたら、すでに削除されているはずのオブジェクトが、削除されていないかもしれません。

ボリスさん、こんにちは。Expert Advisorはオブジェクトを作成しません。このエラーは、保留中の注文を 発注する関数から発生します。以下は、その機能のバージョン(テスター用)です。

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

注文が行われていない場合は、ブロックが発動していることを意味します。

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

これは、エラーを報告するブロックです。


このロジックを理解した人はいるのだろうか?

 
artmedia70:

答えがないので、最後に設定された注文のチケットを返す関数を紹介します。



ありがとうございました!!ちょうど私が必要としていたものです。

 
hoz:
そのとおりです。エラーはオブジェクトに関するものですが、このEAにはオブジェクトがありません...。

ボリスさん、こんにちは。Expert Advisorはオブジェクトを作成しません。このエラーは、保留中の注文を発注する関数から発生します。以下は、その機能のバージョン(テスター用)です。

注文が行われていない場合、ブロックが発生したことを意味します。

これは、エラーを報告するブロックです。

このロジックを理解した人はいるのだろうか?

では、エラーチェックは?何か不具合があるのでは!?
 
borilunad:
では、エラーチェックは?何か不具合があるのでは!?

へー))ボリスのどこが不具合なんだ?全部透明なんだ...。

prは プリント機能です。そして、エラーですが、これはもう標準的な定数です。論理的に考えて、そんなことはまったく許されないのです。それでもpr 機能に疑念を抱いた方は、こちらをご覧ください。

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
string info [];
ArrayResize(info,20);
string h,m,s,cm; int i;
h=DoubleToStr(Hour(),0);    if (StringLen(h)<2) h="0"+h;
m=DoubleToStr(Minute(),0);  if (StringLen(m)<2) m="0"+m;
s=DoubleToStr(Seconds(),0); if (StringLen(s)<2) s="0"+s;
txt=h+":"+m+":"+s+" - "+txt;
for(i=20-1; i>=1; i--)
info[i]=info[i-1];
info[0]=txt;
for(i=20-1; i>=0; i--)
if(info[i]!=""){
cm=info[i];
ObjectCreate ("txtw"+i,OBJ_LABEL,0,0,0);
ObjectSet    ("txtw"+i,OBJPROP_CORNER,1);
ObjectSet    ("txtw"+i,OBJPROP_XDISTANCE,10);
ObjectSet    ("txtw"+i,OBJPROP_YDISTANCE,30+15*i);
ObjectSetText("txtw"+i,cm, 10, "Times New Roman", Green);}}
 

  • この論理を理解できる人はいますか?


ロットは正規化されていますか?よく、価格を確認する。

i_magic, pt, i_distanceFromLastPos はグローバルですか?

 
splxgf:

i_magic, pt, i_distanceFromLastPos はグローバルですか?


そうです。i_の ついた変数は入力変数(intutという言葉から、ユーザーが変更できる...)、ptは グローバル変数でも あり、どこでも見える... 。
splxgf:


  • この論理を理解できる人はいるのだろうか?


ロットは正規化されていますか?よく、価格を確認する。


いいえ、ロットは正規化されていません。テスターでは一度も遭遇したことがない...。また、ロットとオブジェクト(エラー4200)にはどのような関係があるのでしょうか?
 
hoz:

時々(常にではありませんが)、保留中の注文を設定すると4200エラーが発生します。ドキュメントによると、このエラーは、そのオブジェクトがすでに存在していることを意味します。

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

このタイプの注文は、保留中の注文が送信された時点ですでにマーケットにあることが判明しているのですね。

おそらく、他のプログラムが同じ名前のグラフィカルオブジェクトを作成 し、それに対してEAが反応するのでしょう。オブジェクトの名前を変更する必要があるのかもしれません。