MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 475

 

Artyom Trishkin@Konstantin Nikitin

教えてください、 int startを通してvoid NOTIFICATION() 関数をポーリングするのは正しいのでしょうか? そこには、一定のループがあるのですもしかしたら、このロジックを直接startに入れた方が正しいのでは?関数をオーバーロードしないように!それに、もともと自分で読んだ方が気持ちいいように書いていますよ

 
Rewerpool:

Artyom Trishkin@Konstantin Nikitin

教えてください、 int startを通してvoid NOTIFICATION() 関数をポーリングするのは正しいのでしょうか? そこには、一定のループがあるのですこのロジックを一気にスタートさせた方が論理的かも?

OnTick()を使用します。すべては必要なロジックに依存します。
 
どこに挿入すればいいか教えてください//+----------------------------------------------------------------------------- +.
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
 

Expert Advisorのコード本体


列挙子
{
e=1, // パラボリック指標による
};
列挙型tf
{
af=0, // 現在の
bf=1, // 1分
cf=2, // 5分
df=3, // 15分
ef=4, // 30分
ff=5, // 1時間
gf=6, // 4時間
hf=7, // 1日
};

extern int Magic = 123654789;
extern inttern スリッページ = 0;
inttern double Lots = 1;
extern int int rsi_period = 14;
extern int rsi_high = 50;
int rsi_price = PRICE_CLOSE;
extern int rsi_low = 50;
int loss_stop = 5000;
extern int take_profit = 5000;
double sar_step = 0.03。
double sar_max = 0.03。

int GeneralNoLoss = false; // 損益分岐点からの引き離し
int parameters_trailing = e; // トロールメソッド
int StartTrall = -5000; // トロールの最小利益(ポイント数
int StepTrall = 1; //ステップトレーリングストップロス
入力 tf TF_Tralling = af; // インジケータタイムフレーム(0-現在)。
extern int delta = 50; // 計算されたストップロス・レベルからのインデント

double Step = 0.03; //パラボリックステップ(方法4)
double Maximum = 0.03; //放物線状の最大値(方法4)


color text_color = Lime; //情報出力の色

二重マ、RSI、SAR_1、SAR_2、マ_1、マ_2、マ_3、マ_4、マ_5、マ_6。
datetime LastBuyTime, LastSellTime;

int STOPLEVEL;
int TF[10]={0,1,5,15,30,60,240,1440,10080,43200};
ダブル SLB=0,SLS=0;


int OnInit()

{
//---

//---
return(0)です。
}

void OnTick(){。
STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);

int b=0,s=0;
double OOP,price_b=0,price_s=0,lot=0,NLb=0,NLs=0,LS=0,LB=0です。
int tip,Ticket。
ブールエラーです。
ダブルSL,OSL;
int n=0;
if (b==0) SLB=0;
if (s==0) SLS=0;
for (int i=OrdersTotal(); i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
tip = OrderType();
if (tip<2 && (OrderSymbol()==Symbol()))&& (注文マジックナンバー()==マジック))
{
OSL = OrderStopLoss()です。
OOP = OrderOpenPrice()。
Ticket = OrderTicket();
n++;
if (tip==OP_BUY)
{
if (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb)。
if (SL < NLb+StartTrall*Point) continue;
}
さもなくば
{
SL = SlLastBar(OP_BUY,Bid,OOP)。
if (SL < OOP+StartTrall*Point) continue;
}
//if (OSL >= OOP && only_NoLoss) continue;
if (SL >= OSL + StepTrall*Point && (Bid-SL)/Point>STOPLEVEL)。
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White);
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL).If (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
if (tip==OP_SELL)
{
if (GeneralNoLoss)
{
SL = SlLastBar(OP_SELL,Ask,NLs)。
if (SL > NLs-StartTrall*Point) continue;
}
さもなくば
{
SL = SlLastBar(OP_SELL,Ask,OOP)です。
if (SL > OOP-StartTrall*Point) continue;
}
//if (OSL <= OOP && only_NoLoss) continue;
if ((SL <= OSL-StepTrall*Point || OSL==0) && (SL-Ask)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White);
if (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL).If (!error) Comment("TrailingStop Error ",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
}
}
}
}
}
ma = iMA(Symbol(), 0, 70, 0, MODE_SMA, PRICE_CLOSE, 1);
rsi = iRSI(Symbol(), 0, rsi_period, rsi_price, 1);
sar_1 = iSAR(Symbol(), 0, sar_step, sar_max, 1);
sar_2 = iSAR(Symbol(), 0, sar_step, sar_max, 2);


if ((sar_step))
{
LastBuyTime = Time[0];
if(OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), Slippage, Ask - loss_stop*Point, Ask + take_profit*Point, "Order", Magic, 0, clrGreen) > 0){ (オーダー送信)
Print("買い注文が送信されました!");
を返します。
}else Print("買い注文エラー");
}
if ((フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ))
{
LastSellTime = Time[0];
if(OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), Slippage, Bid + loss_stop*Point, Bid - take_profit*Point, "Order", Magic, 0, clrRed) > 0)
{
Print("売り注文が送信されました!");
を返します。
}else Print("Sell Order Error");
}
}

//--------------------------------------------------------------------
double SlLastBar(int tip,double price,double OOP)
{
double prc=0;
switch(パラメータ_trailing)
{
ケース1: // パラボリックインジケーターによる
prc = iSAR(Symbol(),TF[TF_Tralling],Step,Maximum,0)。
if (tip==OP_BUY)
{
prc = NormalizeDouble(prc - delta*Point,Digits);
if(price-STOPLEVEL*Point < prc) prc=0;
ARROW("cm_SL_Buy", prc, 4, clrAqua);
}
if (tip==OP_SELL)
{
prc = NormalizeDouble(prc + delta*Point,Digits);
if(price+STOPLEVEL*Point > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRed);
}
が壊れる。
}
return(prc)です。
}

//--------------------------------------------------------------------
文字列 StrPer(int per)
{
if (per == 0) per=Period();
if (per == 1) return("M1");
if (per == 5) return("M5");
if (per == 15) return("M15");
if (per == 30) return("M30");
if (per == 60) return("H1");
if (per == 240) return("H4");
if (per == 1440) return("D1");
if (per == 10080) return("W1")
if (per == 43200) return("MN1")
return("ピリオドエラー");
}
//+------------------------------------------------------------------+
void ARROW(string 名前, double 価格, int ARROWCODE, 色 c)
{
ObjectDelete(Name)です。
ObjectCreate(Name,OBJ_ARROW,0,Time[0],Price,0,0)です。
ObjectSetInteger(0,Name,OBJPROP_ARROWCODE,ARROWCODE)です。
ObjectSetInteger(0,Name,OBJPROP_SELECTABLE, false)を使用します。
ObjectSetInteger(0,Name,OBJPROP_SELECTED, false)を使用します。
ObjectSetInteger(0,Name,OBJPROP_COLOR, c)です。
ObjectSetInteger(0,Name,OBJPROP_WIDTH, 1)を使用します。
}
//--------------------------------------------------------------------
カラー カラー(bool P,color a,color b)
{
if (P) return(a);
return(b)です。
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
これをどこに挿入すればいいのか、教えてください。

さて...しからば

ようにする

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+

ナイス(^^)))

 
Alekseu Fedotov:

さて...しからば

ようにする

(美しい...)))

でも、マジか(笑)

 
Vladimir Ozharovskiy:

でもマジか(笑)

関数そのものを指しているのであれば、コピーしてプログラムの一番最後に貼り付けてください。

必ずしも void OnTick() 関数の外側である必要はありません。

 
Vladimir Ozharovskiy:

でも、マジか(笑)

この機能には入札、チェック、レポートが ないのですね。

 
Alekseu Fedotov:

関数そのものを意味するのであれば、コピーしてプログラムの最後に貼り付けてください。

void OnTick()関数の外側にあることを確認します。

では、男はどうすればいいのか?正しく呼ばなければならない!

 
助かったような...。ありがとうございました。