質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

1回答

1089閲覧

MQL4のループ処理とアラート処理

nisei2

総合スコア19

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2021/01/28 02:47

前提・実現したいこと

ループ処理で2本前のロウソク足の高値 < 1本前のロウソク足の終値ならば買いのアラート、
2本前のロウソク足の安値 > 1本前のロウソク足の終値ならば売りのアラートをならすプログラムを作りたい。

発生している問題・エラーメッセージ

implicit conversion from 'string' to 'number' declaration of 'up_or_down' hides global variable see previous declaration of 'up_or_down' また、実現したい結果にならない。

該当のソースコード

MQL4

1#property strict 2#property indicator_chart_window 3 4int OnInit() 5 { 6 return(INIT_SUCCEEDED); 7 } 8 9//変数--------------------------------------------------------------------------- 10int up_or_down = 0; 11extern double RiskPercent = 2.0; //総資産に対する損失割合(%) 12 13int OnCalculate(const int rates_total, 14 const int prev_calculated, 15 const datetime &time[], 16 const double &open[], 17 const double &high[], 18 const double &low[], 19 const double &close[], 20 const long &tick_volume[], 21 const long &volume[], 22 const int &spread[]) 23 { 24 25//始値--------------------------------------------------------------------------- 26 double DO1 = iOpen(NULL, PERIOD_D1, 1); //前日の始値 27 double DO2 = iOpen(NULL, PERIOD_D1, 2); //2日前の始値 28 29//終値--------------------------------------------------------------------------- 30 double DC1 = iClose(NULL, PERIOD_D1, 1); //前日の終値 31 double DC2 = iClose(NULL, PERIOD_D1, 2); //2日前の終値 32 33//高値--------------------------------------------------------------------------- 34 double DH1 = iHigh(NULL, PERIOD_D1, 1); //前日の高値 35 double DH2 = iHigh(NULL, PERIOD_D1, 2); //2日前の高値 36 37//安値--------------------------------------------------------------------------- 38 double DL1 = iLow(NULL, PERIOD_D1, 1); //前日の安値 39 double DL2 = iLow(NULL, PERIOD_D1, 2); //2日前の安値 40 41//ループ処理--------------------------------------------------------------------------- 42 int i, day_i, counted_bars = IndicatorCounted(); 43 44 if(counted_bars < 0) 45 return(-1); 46 47 if(counted_bars > 0) 48 counted_bars--; 49 int limit = Bars - counted_bars; 50 51 for(i = limit - 1; i >= 0; i--) { 52 day_i = iBarShift(Symbol(), PERIOD_D1, Time[i], false); 53 54 if(iHigh(Symbol(), PERIOD_D1, day_i - 2) < iClose(Symbol(), PERIOD_D1, day_i - 1)){ 55 up_or_down = 1; 56 } 57 58 if(iLow(Symbol(), PERIOD_D1, day_i - 2) > iClose(Symbol(), PERIOD_D1, day_i - 1)){ 59 up_or_down = -1; 60 } 61 } 62 63 //アラートを一度だけにする処理 64 static datetime timeAlert; 65 if(Time[0] > timeAlert) 66 { 67 if(up_or_down == 1) 68 { 69 //買いアラート--------------------------------------------------------------------------- 70 Alert 71 ( 72 Symbol(),"\n", 73 "エントリー:","BUY","\n", 74 "推奨ロット数:",calcLotSizeRiskPercent(AccountBalance(),Symbol(),Loss_Cut_Width(up_or_down),RiskPercent),"\n", 75 "ストップロス:",DO1,"\n", 76 "日付:",TimeCurrent(),"\n" 77 ); 78 timeAlert = Time[0]; 79 } 80 81 if(up_or_down == -1) 82 { 83 //売りアラート--------------------------------------------------------------------------- 84 Alert 85 ( 86 Symbol(),"\n", 87 "エントリー:","SELL","\n", 88 "推奨ロット数:",calcLotSizeRiskPercent(AccountBalance(),Symbol(),Loss_Cut_Width(up_or_down),RiskPercent),"\n", 89 "ストップロス:",DO1,"\n", 90 "日付:",TimeCurrent(),"\n" 91 ); 92 timeAlert = Time[0]; 93 } 94 } 95 96//--- return value of prev_calculated for next call 97 return(rates_total); 98 } 99//+------------------------------------------------------------------+ 100 101//+------------------------------------------------------------------+ 102//|【関数】資産のN%のリスクのロット数を計算する           | 103//| | 104//|【引数】 IN OUT 引数名 説明 | 105//| --------------------------------------------------------- | 106//| ○ aFunds 資金   | 107//| AccountFreeMargin() | 108//| AccountBalance() | 109//| ○ aSymbol 通貨ペア | 110//| ○ aStopLossPips 損切り値(pips) | 111//| ○ aRiskPercent リスク率(%) | 112//| | 113//|【戻値】ロット数 | 114//| | 115//|【備考】計算した結果、最小ロット数未満になる場合、-1を返す | 116//+------------------------------------------------------------------+ 117double calcLotSizeRiskPercent(double aFunds, string aSymbol, double aStopLossPips, double aRiskPercent) 118{ 119// 取引対象の通貨を1ロット売買した時の1ポイント(pipsではない!)当たりの変動額--------------------------------------------------------------------------- 120 double tickValue = MarketInfo(aSymbol, MODE_TICKVALUE); 121 122// tickValueは最小価格単位で計算されるため、3/5桁業者の場合、10倍しないと1pipsにならない--------------------------------------------------------------------------- 123 if(MarketInfo(aSymbol, MODE_DIGITS) == 3 || MarketInfo(aSymbol, MODE_DIGITS) == 5) { 124 tickValue *= 10.0; 125 } 126 127 double riskAmount = aFunds * (aRiskPercent / 100.0); 128 129 double lotSize = riskAmount / (aStopLossPips * tickValue); 130 131 double lotStep = MarketInfo(aSymbol, MODE_LOTSTEP); 132 133// ロットステップ単位未満は切り捨て--------------------------------------------------------------------------- 134// 0.123⇒0.12(lotStep=0.01の場合)--------------------------------------------------------------------------- 135// 0.123⇒0.1 (lotStep=0.1の場合)--------------------------------------------------------------------------- 136 lotSize = MathFloor(lotSize / lotStep) * lotStep; 137 138// 証拠金ベースの制限 139 double margin = MarketInfo(aSymbol, MODE_MARGINREQUIRED); 140 141 if(margin > 0.0) { 142 double accountMax = aFunds / margin; 143 144 accountMax = MathFloor(accountMax / lotStep) * lotStep; 145 146 if(lotSize > accountMax) { 147 lotSize = accountMax; 148 } 149 } 150 151// 最大ロット数、最小ロット数対応--------------------------------------------------------------------------- 152 double minLots = MarketInfo(aSymbol, MODE_MINLOT); 153 double maxLots = MarketInfo(aSymbol, MODE_MAXLOT); 154 155 if(lotSize < minLots) { 156 // 仕掛けようとするロット数が最小単位に満たない場合、そのまま仕掛けると過剰リスクになるため、エラーに--------------------------------------------------------------------------- 157 lotSize = -1.0; 158 } else if(lotSize > maxLots) { 159 lotSize = maxLots; 160 } 161 162 string LotSize = DoubleToStr(lotSize, 2); 163 164//戻り値ロット数 165 return(LotSize); 166} 167 168//+------------------------------------------------------------------+ 169//| 損切幅関数(前日高値ー当日安値 || 前日安値ー当日高値) | 170//+------------------------------------------------------------------+ 171double Loss_Cut_Width(int up_or_down)//引数は1 or -1を入れる 172{ 173 double loss_cut_width = 0; 174 double width; 175 176 if(up_or_down == 1) { 177 double DH1 = iHigh(NULL, PERIOD_D1, 1); 178 double DC1 = iClose(NULL, PERIOD_D1, 1); 179 180 width = DH1 - DC1; 181 loss_cut_width = PriceToPips(width); 182 } 183 184 if(up_or_down == -1) { 185 double DC1 = iClose(NULL, PERIOD_D1, 1); 186 double DL1 = iLow(NULL, PERIOD_D1, 1); 187 188 width = DC1 - DL1; 189 loss_cut_width = PriceToPips(width); 190 } 191 192 return(loss_cut_width); 193} 194 195//+------------------------------------------------------------------+ 196//|         PIPS変換関数 | 197//+------------------------------------------------------------------+ 198double PriceToPips(double price) 199{ 200 double pips = 0; 201 202//現在の通貨ペアの小数点以下の桁数を取得--------------------------------------------------------------------------- 203 int digits = (int)MarketInfo(Symbol(), MODE_DIGITS); 204 205// 3桁・5桁のFXブローカーの場合--------------------------------------------------------------------------- 206 if(digits == 3 || digits == 5) { 207 pips = price * MathPow(10, digits) / 10; 208 } 209// 2桁・4桁のFXブローカーの場合--------------------------------------------------------------------------- 210 if(digits == 2 || digits == 4) { 211 pips = price * MathPow(10, digits); 212 } 213// 少数点以下を1桁に丸める(目的によって桁数は変更する)--------------------------------------------------------------------------- 214 pips = NormalizeDouble(pips, 1); 215 216 return(pips); 217 218}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/01/28 06:44

//変数----------------------- int up_or_down = 0; と double Loss_Cut_Width(int up_or_down) の変数名が同じなので調整してください。
nisei2

2021/01/28 22:07

教えていただきありがとうございました!
guest

回答1

0

ベストアンサー

implicit conversion from 'string' to 'number'

calcLotSizeRiskPercentがdoubleを返すべきところが文字列を返しています。

また、実現したい結果にならない。

int up_or_down = 0;がグローバル変数になっているので前回の結果がクリアされないまま残ってしまうのでは?

投稿2021/01/30 08:56

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nisei2

2021/01/31 08:16

ローカル変数にしないといけなかったのですね、やってみます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問