前提・実現したいこと
ループ処理で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}
回答1件
あなたの回答
tips
プレビュー