ここから本文です

FX MT4 アラートプログラムについて アラートプログラムを作っているのですが、...

mos********さん

2015/12/2814:44:29

FX MT4 アラートプログラムについて

アラートプログラムを作っているのですが、
起動時に過去の分も読み込んでしまい
時間足を変えるたび
MT4を起動するたびに

アラートがなってしまいます。

起動したときはならずに、そのあとになってほしいのですが
どうしたら、解決しますでしょうか

作ったプログラムは
陽線ならば、矢印を出して、アラートを鳴らすという
単純なプログラムです。

また、ろうそく足の完成が残り2分ならば というのを付け加えたいです。
残り2分 + 陽線ならばアラート みたいな
どなたか、ご教授よろしくお願いします。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
double Buf1[];
int init() { SetIndexStyle(0,DRAW_ARROW); SetIndexBuffer(0,Buf1); SetIndexArrow(0,233); return(0);}
int start()
{
int limit;
int counted_bars = IndicatorCounted();
if (counted_bars<0) return(-1);
if (counted_bars>0) counted_bars--;
limit = Bars - counted_bars;

for(int i=limit; i>=0; i--)
{double c1 = iClose(NULL,0,i);
double o1 = iOpen (NULL,0,i);
double l1 = iLow (NULL,0,i);
bool yousen = o1 < c1; // 1 =陽線 0 =陰線

if(yousen ) {Buf1[i] = l1-1*Point;
DoAlert();}
else Buf1[i] = 0;
}
return(0);}
//+------------------------------------------------------------------+

//アラートプログラム-----------------
void DoAlert()
{ if (!NewBar()) return;
Alert(Symbol()+"ok");
}
int NewBar(){
static datetime dt = 0;
if (dt != Time[0]){
dt = Time[0];
return(true);}
return(0);}

この質問は、tre********さんに回答をリクエストしました。

閲覧数:
777
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tre********さん

リクエストマッチ

2015/12/2906:25:06

/* mosimo_kamiさんへ

こんなかんじかな…?

・インジケータスタートおよびリスタートより、起動時警告無効時間(秒)内に発生したアラートについては表示を行いません。
(エキスパートログに、警告無効によりアラートを表示しなかった事を記録として残します。)
(※MT4→チャート→更新を行うとリスタート扱いになります)
・事前警告時間内に対象通貨ペアに一度もTickが無い場合(閑散期等)、インジケータが実行されませんので、アラートも出力されません。
・事前警告時間については、月足には対応していません。(めんどくさいので…(^_^;)


バグがあったら、ごめんなさい。(^_^;

*/


#property indicator_chart_window
#property strict

input int InpStartupAlertDisableSecond = 10;//起動時警告無効時間(秒)(インジケータ起動よりこの時間内に発生したアラートは表示しません)
input int InpPreAlertSecond = 120;//事前警告時間(秒)(バーの残り時間がこの時間以下で条件一致するとアラートします)
input bool InpIsCommentDisp = true;//デバッグ用コメント表示の有無(true=表示)

//------------------------------------------------------------
int init()
{
return 0;
}


//------------------------------------------------------------
//コメント処理用クラス
class CMyComment{
string _msg;
public:
void Reset(){_msg="";}
void Add(string msg){
if(!InpIsCommentDisp)return;
_msg += msg;
}
void Out(){
if(!InpIsCommentDisp)return;
Comment(_msg);
Reset();
}
}MyComment;


//------------------------------------------------------------
//アラート条件関数
bool IsMyAlert()
{
return Close[0] > Open[0];
}

//------------------------------------------------------------
//事前警報処理関数
//bool AlertEnabled:true=アラート表示有効/false=アラート表示無効
void PreAlertMain(bool AlertPopEnabled=true)
{
static datetime PrevAlertBarTime;//前回アラートバー時刻
datetime AlertStartTime = Time[0]+PeriodSeconds()-InpPreAlertSecond;//アラート開始時刻

//デバッグ用コメント追加
MyComment.Add(StringConcatenate(
"\nAlertPopEnabled=",AlertPopEnabled,
"\nTimeCurrent()=",TimeCurrent(),
"\nPeriodSeconds()=",PeriodSeconds(),
"\nAlertStartTime=",AlertStartTime,
"\nAlertStartTime-TimeCurrent()=",(int)(AlertStartTime-TimeCurrent())," seconds",
"\n"));

if(TimeCurrent() < AlertStartTime)return;//アラート開始時間前の時、何もしない

if(PrevAlertBarTime == Time[0])return;//前回アラートバー時刻と同じ時、何もしない(アラートは1回しか表示しない)

if(!IsMyAlert())return;//アラートでない時、何もしない


//アラートの時
string alert_msg = StringConcatenate(Symbol(),",M",Period()," UP");

if(AlertPopEnabled){
//アラート表示有効時、アラートを出す(ログにも残る)
Alert(alert_msg);
}else{
//アラート表示無効時、アラートログを残す
Print("Alert Log:",alert_msg,"(AlertPopDisable)");
}

PrevAlertBarTime = Time[0];//アラートバー時間を保持

}

//------------------------------------------------------------
//リスタート時非表示、事前警報処理関数
void StartUpDisablePreAlertMain()
{
static datetime ReStartTime;

if(IsConnected()){
if(IndicatorCounted() == 0){
//サーバー接続済み&リスタート時
ReStartTime = TimeCurrent();
}

if(ReStartTime){
//リスタート時間が設定されている時
int RunSecond = (int)(TimeCurrent()-ReStartTime);//インジケータ稼働時間(秒)

//デバッグ用コメント追加
MyComment.Add(StringConcatenate("ReStartTime=",ReStartTime,"\nRunTime=",TimeCurrent()-ReStartTime));

PreAlertMain(RunSecond > InpStartupAlertDisableSecond);//稼働指定時間内はアラート出力しない

//デバッグ用コメント出力
MyComment.Out();
}
}else{
Print("UnConnected...");
}
}

//+------------------------------------------------------------------+
//| 指標処理関数 |
//+------------------------------------------------------------------+
int start()
{
StartUpDisablePreAlertMain();

return 0;
}

void deinit()
{
if(InpIsCommentDisp)Comment("");
}

  • 質問者

    mos********さん

    2015/12/2917:41:37

    ありがとうございます!
    めっちゃ勉強になります。

    時間かけて、氏の書いていただいたプログラムを勉強したいと思います。

    ところでなのですが
    return;
    return0;
    return(0);
    は何が違うのでしょうか

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

mas********さん

2015/12/2915:04:09

自分はシステムトレードをやってます。
もし良かったら一緒に作ってみませんか?
興味なければスルーしてください。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

oka********さん

2015/12/2816:24:07

バカ過ぎるの〜
答えは簡単だが
これ位は2〜3日悩め!
でないと、この先一歩も進めんよ

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる