//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ extern double lots=0.01; extern int SL_in_pips; extern int TP_in_pips; int x2; int init() { if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0) { SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt."); } if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0) { TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL); Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt."); } x2=1; while(x2!=0) { if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1) { Alert("Ордер типа BUY успешно открыт"); OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0); x2=GetLastError(); if(x2==0) Alert("Ордер типа SELL успешно открыт"); if(x2!=0) Alert("Ордер типа SELL не открыт. Ошибка №: ",x2); }else { x2=GetLastError(); if(x2!=0) Alert("Ордер типа BUY не открыт. Ошибка №: ",x2); } } //---- return(0);
簡単なExpert Advisorを得るためにこのコードを改良するのを助けてください。要するに、現在の 価格でストップを指定して売りと買いの2つのポジションを建てるというシンプルなものです。そして、そのどちらか、あるいは両方がトリガーされると、新しいポジションをオープンします。本質は単純なようで、やはりうまくいかない Thanks lot!
//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);
これだけだと正確に見えるが、マシンビューでは最後のビットが異なる値をとることがある。例:2.9999、3または3.00000001
このような誤解を解くために、MQLではNormalizeDouble()という関数があります。
はい、NormalizeDouble()は役に立ちます、ありがとうございます。
しかし、どうしてこのようなことが可能なのか、まだ不明です。単純な除算のようで、0.5や0.9、あるいは0.31を0.1で割れば、すべてうまくいくのです。
で、ここでは明らかに2.9を持ってるんだけど、はっきりしない...電卓の方が正確だ:-)
Reshetovと splxgfに 感謝します。 。
でも、どうしてそんなことができるのか、やはり単純な割り算のようです。 それに、0.5や0.9、あるいは0.31を0.1で割ればOKなんです。
で、こっちは2.9と、はっきりしない...電卓の方が正確です :-)
電卓には四捨五入の機能が組み込まれています。そして、浮動小数点数の計算に同じ演算コプロセッサを使用しているため、同じように解くことができるのです。
こんにちは。
ヒントを教えてください!!!!
自分ではどうしたらいいかわからない。
タスク
EAは1日1回、1-2個の注文を入れる。
変数の初期値は手動で設定し、1~10までの値を取ることができます。
先に設定した変数を1刻みで-10に変更する必要があります。
EAの各営業日に、その日にTPが実行されなかった場合、1だけ加算されます。
TPが実行されると、この変数は値-1を返す。
SLを数えるのは、1つでも2つでもいいし、1日に1回しか値を変えられないので、適さない。
すなわち
変数 = 1
1日目 SL - 変数 =2
2日目 SL - 変数 =3
3日目 SL - 変数 =4
4日目 TP - 変数 =1
5日目 SL - 変数 =2
...といった具合に。
助けて
ありがとうございます。
簡単なExpert Advisorを得るためにこのコードを改良するのを助けてください。要するに、現在の価格でストップを指定して売りと買いの2つのポジションを建てるというシンプルなものです。そして、そのどちらか、あるいは両方がトリガーされると、新しいポジションをオープンします。本質は単純なようで、やはりうまくいかない Thanks lot!
目利きの方、よろしくお願いします。
単周期のモメンタムを計算し、大周期で積分して、インジケータとして出力するコードがあります。
与えられた周期で、得られた曲線の平均を求め、それをインジケータとして出力するようなインジケータを書きたいのですが。
そのコードを添付します。
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_width1 2
//------- 外部インジケータ・パラメータ --------------------------------------------------------+.
extern int MTM_Period = 1;
//extern int MTM_Integr_Period = 1000;
//extern int Applied_Price = 0; // 中古価格です。
// 0 - price_close
// 1 - price_open
// 2 - プライス・ハイ
// 3 - 価格が低い
// 4 - 価格メジアン
// 5 - price_typical
// 6 - 価格加重
extern NumberOfBars = 1000; // バーの数 (0-all)
//------- インジケータ・バッファ -------------------------------------------------------------------------------+.
double buf0[];
//+----------------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+----------------------------------------------------------------------------+
void init() {
SetIndexBuffer (0, buf0);
SetIndexEmptyValue(0, 0)を設定します。
SetIndexLabel (0, "i-mtm_integr")を設定する。
SetIndexStyle (0, DRAW_LINE) を設定します。
}
//+----------------------------------------------------------------------------+
//| カスタムインジケーター初期化関数
//+----------------------------------------------------------------------------+
void deinit() {
Comment(")です。
}
//+----------------------------------------------------------------------------+
//| カスタムインジケータ反復関数
//+----------------------------------------------------------------------------+
void start() {
int LoopBegin, i,j, per=3;
double mtm, mtmsum;
if (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=NumberOfBars;
LoopBegin=MathMin(LoopBegin,Bars-1)となります。
for (i=LoopBegin; i>=0; i--) {.
mtm=Close[i]-Close[MTM_Period+i]となります。
mtmsum=mtmsum+mtm;
buf0[i]=mtmsum;
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Close[i]-Close[MTM_Period+i]となります。
mtmsum[i]=0+mtm;
for (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per;
buf0[i]=mtmsum[i]。
}
}*/
}
//+----------------------------------------------------------------------------+
目利きの方、よろしくお願いします。
単周期のモメンタムを計算し、大周期で積分して、インジケータとして出力するコードがあります。
与えられた周期で、得られた曲線の平均を求め、それをインジケータとして出力するようなインジケータを書きたいのですが。
これだけだと正確に見えるが、マシンビューでは最後のビットが異なる値をとることがある。例:2.9999、3または3.00000001
このような誤解をなくすために、MQLにはNormalizeDouble()関数があります。
NormalizeDouble()関数が、Ask、Bid、Lowなどのすべての値に対してデフォルトで実行されないのはなぜですか?
みんなそれに引っかかって、"手動で "直さなければならない...。MTが自ら産み出したものを読めないのは不思議だ。
ありがとうございます。start()でデータが利用できる保証はありますか?
RefreshRates()を使ってみてください。
EA最適化で「レポートとして保存」オプションがあるが、インターネットエクスプローラーで「入力パラメータ」が表示されない。
とはいえ、htmlコードから判断すると、そこに存在しているのは事実です。一般に、これらのパラメーターのために最適化が始められたと言えるでしょう。
エクスプローラーで見る方法を知っている人がいるかも?
(別コマンドでテキストファイルにコピーすることも可能ですが、IEで見るのが望ましいです)。