//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------
for(int i2=total-1; i2>=0; i2--) if(OrderSelect(i2, SELECT_BY_POS)) if(OrderSymbol()==Symbol() ) if (OrderMagicNumber()==Magic) { if (OrderType()==OP_BUY) { if (sig2==1) {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
} if (OrderType()==OP_SELL) { if (sig2==2) {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_BUYSTOP) {
if (sig2==2&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELLSTOP) {
if (sig2==1&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50) { UP[i]=Low[i]-distance*MyPoint; } //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50) //{ // DOWN[i]=High[i]+distance*MyPoint; //} } //--- return value of prev_calculated for next call return(rates_total); }
あなたのサイクルは奇妙です。不思議ですね。
//+------------------------------------------------------------------+ if(rates_total<xxx) return(0); // xxx здесь - количество баров, при которых невозможно рассчитать индикатор int limit=rates_total-prev_calculated; if(limit>1) { // limit больше 1 в том случае, когда в истории произошли изменения limit=rates_total-1; // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п. // тут проводим действия когда нужно пересчитать всю историю } //--- for(int i=limit; i>=0; i--) { // основной цикл индикатора } //+------------------------------------------------------------------+
よかったです。エラーの発生箇所を教えてください。
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
すべてうまくいき、maxpr1の値段で注文する。
それなら、同じようにminpr1価格でやりたい。
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
130エラー(停止位置が違う)。私は何を間違えているのだろう?
保留中の注文を出すとき、始値は市場に近すぎてはいけません。また、MarketInfo()関数のMODE_STOPLEVELパラメータを使用して、現在の市場価格からの保留価格の最小距離(ポイント)を取得することも可能です。保留中の注文の建値が正しくない場合、エラー 130 (ERR_INVALID_STOPS) が発生します。
いや、そうじゃなくて、ギャップがあるんです。さらに、買い保留を変更し、同じチャートでテストしてみましたが、同じエラーでした。
隙間は隙間でも、おそらく以下をすべて読んでいないはずです。
................... 保留中の注文の 建値が正しくない場合、エラー 130 (ERR_INVALID_STOPS) ....................が発生します。
つまり、OP_SELLLIMITを市場価格より低く設定しようとしている。
隙間は隙間でも、おそらく以下をすべて読んでいないはずです。
................... 保留中の注文の 建値が正しくない場合、エラー 130 (ERR_INVALID_STOPS) ....................が発生します。
OP_SELLLIMITを市場価格より低く設定しようとしている。
for(int i2=total-1; i2>=0; i2--)
if(OrderSelect(i2, SELECT_BY_POS))
if(OrderSymbol()==Symbol() )
if (OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY)
{
if (sig2==1) {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELL)
{
if (sig2==2) {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_BUYSTOP)
{
if (sig2==2&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELLSTOP)
{
if (sig2==1&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
}
}
//+------------------------------------------------------------------+
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;}.// 買いストップ
未決済の取引を単独で決済するシグナルはありません。
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;}.// 買いストップ
取引を終了するためのシグナルはありません。
小節ゼロでは信号が「ちらつき」、これは事後的には見えません。テスターのすべての目盛りでビジュアライゼーションを実行すると、質問が消えます。
これは問題ではありません。 注文がトリガーされると取引が開始され、新しいローソク 足が表示され、逆信号がなければすぐに閉じられます。 だから、取引を閉じるためのコードの断片を提供したのです。
こんにちは。
何が問題なのか、教えてください。
M1期間では指標線 がレベル20を超え、M5期間では指標線がレベル50を超えている場合に設定されるはずです。
M5のラインが設定値である50を下回っていても、なぜかマークが設定される。
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
{
UP[i]=Low[i]-distance*MyPoint;
}
//if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
//{
// DOWN[i]=High[i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
こんにちは。
何が問題なのか、教えてください。
M1期間では指標線 がレベル20を超え、M5期間では指標線がレベル50を超えている場合に設定されるはずです。
M5の線が設定値である50を下回っていても、なぜか標識が設定されている。
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
{
UP[i]=Low[i]-distance*MyPoint;
}
//if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
//{
// DOWN[i]=High[i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
あなたのサイクルは奇妙です。不思議ですね。
if(rates_total<xxx) return(0); // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
int limit=rates_total-prev_calculated;
if(limit>1) { // limit больше 1 в том случае, когда в истории произошли изменения
limit=rates_total-1; // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
// тут проводим действия когда нужно пересчитать всю историю
}
//---
for(int i=limit; i>=0; i--) {
// основной цикл индикатора
}
//+------------------------------------------------------------------+
なぜ1つ以上のチェックに制限をかけるのか。例えば、履歴が読み込まれ、その差は1より大きくなる。全てが正常な場合、差分rates_total-prev_calculatedは0か1のどちらかになります。
0 - 新しいティックが来て、新しいバーが形成され始めていない状態です。
1 - 新しいティックが来て、新しいバーが形成され始めています。
インジケーターの全体像を見せてください - 何が問題なのか見てみましょう。