├── Dockerfile ├── README.md ├── compiler.go ├── files ├── MQL4 │ ├── Files │ │ ├── constant.txt │ │ └── test.txt │ ├── Include │ │ ├── Arrays │ │ │ ├── Array.mqh │ │ │ ├── ArrayChar.mqh │ │ │ ├── ArrayDouble.mqh │ │ │ ├── ArrayFloat.mqh │ │ │ ├── ArrayInt.mqh │ │ │ ├── ArrayLong.mqh │ │ │ ├── ArrayObj.mqh │ │ │ ├── ArrayShort.mqh │ │ │ ├── ArrayString.mqh │ │ │ ├── List.mqh │ │ │ ├── Tree.mqh │ │ │ └── TreeNode.mqh │ │ ├── Canvas │ │ │ └── Canvas.mqh │ │ ├── ChartObjects │ │ │ ├── ChartObject.mqh │ │ │ ├── ChartObjectPanel.mqh │ │ │ ├── ChartObjectsArrows.mqh │ │ │ ├── ChartObjectsBmpControls.mqh │ │ │ ├── ChartObjectsChannels.mqh │ │ │ ├── ChartObjectsFibo.mqh │ │ │ ├── ChartObjectsGann.mqh │ │ │ ├── ChartObjectsLines.mqh │ │ │ ├── ChartObjectsShapes.mqh │ │ │ └── ChartObjectsTxtControls.mqh │ │ ├── Charts │ │ │ └── Chart.mqh │ │ ├── Controls │ │ │ ├── BmpButton.mqh │ │ │ ├── Button.mqh │ │ │ ├── CheckBox.mqh │ │ │ ├── CheckGroup.mqh │ │ │ ├── ComboBox.mqh │ │ │ ├── DateDropList.mqh │ │ │ ├── DatePicker.mqh │ │ │ ├── Defines.mqh │ │ │ ├── Dialog.mqh │ │ │ ├── Edit.mqh │ │ │ ├── Label.mqh │ │ │ ├── ListView.mqh │ │ │ ├── Panel.mqh │ │ │ ├── Picture.mqh │ │ │ ├── RadioButton.mqh │ │ │ ├── RadioGroup.mqh │ │ │ ├── Rect.mqh │ │ │ ├── Scrolls.mqh │ │ │ ├── SpinEdit.mqh │ │ │ ├── TimePicker.mqh │ │ │ ├── Wnd.mqh │ │ │ ├── WndClient.mqh │ │ │ ├── WndContainer.mqh │ │ │ ├── WndObj.mqh │ │ │ └── res │ │ │ │ ├── CheckBoxOff.bmp │ │ │ │ ├── CheckBoxOn.bmp │ │ │ │ ├── Close.bmp │ │ │ │ ├── CloseDisable.bmp │ │ │ │ ├── CloseOff.bmp │ │ │ │ ├── CloseOn.bmp │ │ │ │ ├── DateDropOff.bmp │ │ │ │ ├── DateDropOn.bmp │ │ │ │ ├── Down.bmp │ │ │ │ ├── DownDisable.bmp │ │ │ │ ├── DownSmall.bmp │ │ │ │ ├── DownTransp.bmp │ │ │ │ ├── DropOff.bmp │ │ │ │ ├── DropOn.bmp │ │ │ │ ├── ExpandDisable.bmp │ │ │ │ ├── ExpandOff.bmp │ │ │ │ ├── ExpandOn.bmp │ │ │ │ ├── HelpDisable.bmp │ │ │ │ ├── HelpOff.bmp │ │ │ │ ├── HelpOn.bmp │ │ │ │ ├── Left.bmp │ │ │ │ ├── LeftDisable.bmp │ │ │ │ ├── LeftTransp.bmp │ │ │ │ ├── RadioButtonOff.bmp │ │ │ │ ├── RadioButtonOn.bmp │ │ │ │ ├── Restore.bmp │ │ │ │ ├── RestoreDisable.bmp │ │ │ │ ├── RestoreOff.bmp │ │ │ │ ├── RestoreOn.bmp │ │ │ │ ├── Right.bmp │ │ │ │ ├── RightDisable.bmp │ │ │ │ ├── RightTransp.bmp │ │ │ │ ├── SpinDec.bmp │ │ │ │ ├── SpinInc.bmp │ │ │ │ ├── ThumbHor.bmp │ │ │ │ ├── ThumbHorDisable.bmp │ │ │ │ ├── ThumbVert.bmp │ │ │ │ ├── ThumbVertDisable.bmp │ │ │ │ ├── Turn.bmp │ │ │ │ ├── TurnOff.bmp │ │ │ │ ├── TurnOn.bmp │ │ │ │ ├── Up.bmp │ │ │ │ ├── UpDisable.bmp │ │ │ │ ├── UpSmall.bmp │ │ │ │ ├── UpTransp.bmp │ │ │ │ ├── down_smoll.bmp │ │ │ │ └── up_smoll.bmp │ │ ├── Files │ │ │ ├── File.mqh │ │ │ ├── FileBin.mqh │ │ │ ├── FilePipe.mqh │ │ │ └── FileTxt.mqh │ │ ├── Indicators │ │ │ ├── BillWilliams.mqh │ │ │ ├── Custom.mqh │ │ │ ├── Indicator.mqh │ │ │ ├── Indicators.mqh │ │ │ ├── Oscilators.mqh │ │ │ ├── Series.mqh │ │ │ ├── TimeSeries.mqh │ │ │ ├── Trend.mqh │ │ │ └── Volumes.mqh │ │ ├── MovingAverages.mqh │ │ ├── Object.mqh │ │ ├── StdLibErr.mqh │ │ ├── Strings │ │ │ └── String.mqh │ │ ├── Tools │ │ │ └── DateTime.mqh │ │ ├── WinUser32.mqh │ │ ├── stderror.mqh │ │ └── stdlib.mqh │ ├── Indicators │ │ ├── ATR.ex4 │ │ ├── ATR.mq4 │ │ ├── Accelerator.ex4 │ │ ├── Accelerator.mq4 │ │ ├── Accumulation.ex4 │ │ ├── Accumulation.mq4 │ │ ├── Alligator.ex4 │ │ ├── Alligator.mq4 │ │ ├── Awesome.ex4 │ │ ├── Awesome.mq4 │ │ ├── Bands.ex4 │ │ ├── Bands.mq4 │ │ ├── Bears.ex4 │ │ ├── Bears.mq4 │ │ ├── Bulls.ex4 │ │ ├── Bulls.mq4 │ │ ├── CCI.ex4 │ │ ├── CCI.mq4 │ │ ├── Custom Moving Averages.ex4 │ │ ├── Custom Moving Averages.mq4 │ │ ├── Examples │ │ │ └── SimplePanel │ │ │ │ ├── PanelDialog.mqh │ │ │ │ ├── SimplePanel.ex4 │ │ │ │ └── SimplePanel.mq4 │ │ ├── Heiken Ashi.ex4 │ │ ├── Heiken Ashi.mq4 │ │ ├── Ichimoku.ex4 │ │ ├── Ichimoku.mq4 │ │ ├── MACD.ex4 │ │ ├── MACD.mq4 │ │ ├── Momentum.ex4 │ │ ├── Momentum.mq4 │ │ ├── OsMA.ex4 │ │ ├── OsMA.mq4 │ │ ├── Parabolic.ex4 │ │ ├── Parabolic.mq4 │ │ ├── RSI.ex4 │ │ ├── RSI.mq4 │ │ ├── Stochastic.ex4 │ │ ├── Stochastic.mq4 │ │ ├── ZigZag.ex4 │ │ ├── ZigZag.mq4 │ │ ├── iExposure.ex4 │ │ ├── iExposure.mq4 │ │ └── mqlcache.dat │ ├── Libraries │ │ ├── mqlcache.dat │ │ ├── stdlib.ex4 │ │ └── stdlib.mq4 │ ├── Logs │ │ ├── 20160608.log │ │ └── 20160609.log │ └── Scripts │ │ ├── Examples │ │ ├── DLL │ │ │ ├── DLLSample.cpp │ │ │ ├── DLLSample.def │ │ │ ├── DLLSampleTester.ex4 │ │ │ ├── DLLSampleTester.mq4 │ │ │ └── Libraries │ │ │ │ └── DLLSample.dll │ │ └── Pipes │ │ │ ├── PipeClient.ex4 │ │ │ ├── PipeClient.mq4 │ │ │ ├── PipeClientPure.ex4 │ │ │ └── PipeClientPure.mq4 │ │ ├── PeriodConverter.ex4 │ │ ├── PeriodConverter.mq4 │ │ └── mqlcache.dat ├── compile.sh ├── compiler ├── metaeditor.exe └── simpleServer └── sample.mq4 /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM suchja/wine:latest 2 | MAINTAINER contact@myforexidea.com 3 | USER root 4 | RUN mkdir -p /softwares/mt4/MQL4/Experts 5 | COPY files/*.* /softwares/mt4/ 6 | COPY files/compiler /softwares/mt4/ 7 | COPY files/MQL4 /softwares/mt4/MQL4 8 | run chown -R xclient /softwares/mt4 9 | USER xclient 10 | CMD cd /softwares/mt4 && ./compiler 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mql4-compiler-docker 2 | -------------------------------------------------------------------------------- /compiler.go: -------------------------------------------------------------------------------- 1 | package main 2 | import ( 3 | "io/ioutil" 4 | "net/http" 5 | "regexp" 6 | "fmt" 7 | "os/exec" 8 | "os" 9 | "time" 10 | ) 11 | 12 | type Script struct { 13 | Title string 14 | Body []byte 15 | } 16 | 17 | /* 18 | func loadPage(title string) (*Page, error) { 19 | filename := title + ".txt" 20 | body, err := ioutil.ReadFile(filename) 21 | if err != nil { 22 | return nil, err 23 | } 24 | return &Page{Title: title, Body: body}, nil 25 | }*/ 26 | 27 | func compileHandler(w http.ResponseWriter, r *http.Request, title string) { 28 | fmt.Printf("Received %s\n", title) 29 | 30 | body, err := ioutil.ReadAll(r.Body) 31 | if err != nil { 32 | http.Error(w, err.Error(), http.StatusInternalServerError) 33 | return 34 | } 35 | 36 | 37 | s := &Script{Title: title, Body: []byte(body)} 38 | filename := s.Title + ".mq4"; 39 | err = ioutil.WriteFile("MQL4/Experts/" + filename, s.Body, 0600) 40 | if err != nil { 41 | http.Error(w, err.Error(), http.StatusInternalServerError) 42 | return 43 | } 44 | 45 | exec.Command("./compile.sh", filename).Run() 46 | file, err := os.Open("MQL4/Experts/" + s.Title + ".ex4") 47 | if err != nil { 48 | http.Error(w, err.Error(), http.StatusInternalServerError) 49 | return 50 | } 51 | 52 | http.ServeContent(w, r, "result.ex4", time.Now(), file) 53 | } 54 | 55 | 56 | var validPath = regexp.MustCompile("^/(compile)/([a-zA-Z0-9]+)$") 57 | func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { 58 | return func(w http.ResponseWriter, r *http.Request) { 59 | m := validPath.FindStringSubmatch(r.URL.Path) 60 | if m == nil { 61 | http.NotFound(w, r) 62 | return 63 | } 64 | fn(w, r, m[2]) 65 | } 66 | } 67 | 68 | func main() { 69 | http.HandleFunc("/compile/", makeHandler(compileHandler)) 70 | http.ListenAndServe(":8080", nil) 71 | } 72 | -------------------------------------------------------------------------------- /files/MQL4/Files/constant.txt: -------------------------------------------------------------------------------- 1 | var ACCOUNT_BALANCE=37 2 | var ACCOUNT_COMPANY=2 3 | var ACCOUNT_CREDIT=38 4 | var ACCOUNT_CURRENCY=36 5 | var ACCOUNT_EQUITY=40 6 | var ACCOUNT_FREEMARGIN=42 7 | var ACCOUNT_LEVERAGE=35 8 | var ACCOUNT_LIMIT_ORDERS=47 9 | var ACCOUNT_LOGIN=0 10 | var ACCOUNT_MARGIN=41 11 | var ACCOUNT_MARGIN_LEVEL=43 12 | var ACCOUNT_MARGIN_SO_CALL=45 13 | var ACCOUNT_MARGIN_SO_MODE=44 14 | var ACCOUNT_MARGIN_SO_SO=46 15 | var ACCOUNT_NAME=1 16 | var ACCOUNT_PROFIT=39 17 | var ACCOUNT_SERVER=3 18 | var ACCOUNT_STOPOUT_MODE_MONEY=1 19 | var ACCOUNT_STOPOUT_MODE_PERCENT=0 20 | var ACCOUNT_TRADE_ALLOWED=33 21 | var ACCOUNT_TRADE_EXPERT=34 22 | var ACCOUNT_TRADE_MODE=32 23 | var ACCOUNT_TRADE_MODE_CONTEST=1 24 | var ACCOUNT_TRADE_MODE_DEMO=0 25 | var ACCOUNT_TRADE_MODE_REAL=2 26 | var TIME_DATE=1 27 | var TIME_MINUTES=2 28 | var TIME_SECONDS=4 29 | var PERIOD_CURRENT=0 30 | var PERIOD_D1=1440 31 | var PERIOD_H1=60 32 | var PERIOD_H12=720 33 | var PERIOD_H2=120 34 | var PERIOD_H3=180 35 | var PERIOD_H4=240 36 | var PERIOD_H6=360 37 | var PERIOD_H8=480 38 | var PERIOD_M1=1 39 | var PERIOD_M10=10 40 | var PERIOD_M12=12 41 | var PERIOD_M15=15 42 | var PERIOD_M2=2 43 | var PERIOD_M20=20 44 | var PERIOD_M3=3 45 | var PERIOD_M30=30 46 | var PERIOD_M4=4 47 | var PERIOD_M5=5 48 | var PERIOD_M6=6 49 | var PERIOD_MN1=43200 50 | var PERIOD_W1=10080 51 | var INDICATOR_DIGITS=0 52 | var INDICATOR_HEIGHT=10 53 | var INDICATOR_LEVELCOLOR=5 54 | var INDICATOR_LEVELS=4 55 | var INDICATOR_LEVELSTYLE=6 56 | var INDICATOR_LEVELTEXT=9 57 | var INDICATOR_LEVELVALUE=8 58 | var INDICATOR_LEVELWIDTH=7 59 | var INDICATOR_MAXIMUM=3 60 | var INDICATOR_MINIMUM=2 61 | var INDICATOR_SHORTNAME=1 62 | var WHOLE_ARRAY=0 63 | var GANN_DOWN_TREND=1 64 | var GANN_UP_TREND=0 65 | var MODE_CHIKOUSPAN=5 66 | var MODE_GATORJAW=1 67 | var MODE_GATORLIPS=3 68 | var MODE_GATORTEETH=2 69 | var MODE_KIJUNSEN=2 70 | var MODE_LOWER=2 71 | var MODE_MAIN=0 72 | var MODE_MINUSDI=2 73 | var MODE_PLUSDI=1 74 | var MODE_SENKOUSPANA=3 75 | var MODE_SENKOUSPANB=4 76 | var MODE_SIGNAL=1 77 | var MODE_TENKANSEN=1 78 | var MODE_UPPER=1 79 | var STO_CLOSECLOSE=1 80 | var STO_LOWHIGH=0 81 | var MODE_ASK=10 82 | var MODE_BID=9 83 | var MODE_DIGITS=12 84 | var MODE_EXPIRATION=21 85 | var MODE_FREEZELEVEL=33 86 | var MODE_LOTSIZE=15 87 | var MODE_LOTSTEP=24 88 | var MODE_MARGINCALCMODE=28 89 | var MODE_MARGINHEDGED=31 90 | var MODE_MARGININIT=29 91 | var MODE_MARGINMAINTENANCE=30 92 | var MODE_MARGINREQUIRED=32 93 | var MODE_MAXLOT=25 94 | var MODE_MINLOT=23 95 | var MODE_POINT=11 96 | var MODE_PROFITCALCMODE=27 97 | var MODE_SPREAD=13 98 | var MODE_STARTING=20 99 | var MODE_STOPLEVEL=14 100 | var MODE_SWAPLONG=18 101 | var MODE_SWAPSHORT=19 102 | var MODE_SWAPTYPE=26 103 | var MODE_TICKSIZE=17 104 | var MODE_TICKVALUE=16 105 | var MODE_TRADEALLOWED=22 106 | var MODE_HISTORY=1 107 | var MODE_TRADES=0 108 | var SELECT_BY_POS=0 109 | var SELECT_BY_TICKET=1 110 | var OP_BUY=0 111 | var OP_BUYLIMIT=2 112 | var OP_BUYSTOP=4 113 | var OP_SELL=1 114 | var OP_SELLLIMIT=3 115 | var OP_SELLSTOP=5 116 | var PRICE_CLOSE=0 117 | var PRICE_HIGH=2 118 | var PRICE_LOW=3 119 | var PRICE_MEDIAN=4 120 | var PRICE_OPEN=1 121 | var PRICE_TYPICAL=5 122 | var PRICE_WEIGHTED=6 123 | var MODE_CLOSE=3 124 | var MODE_HIGH=2 125 | var MODE_LOW=1 126 | var MODE_OPEN=0 127 | var MODE_TIME=5 128 | var MODE_VOLUME=4 129 | var SERIES_BARS_COUNT=0 130 | var SERIES_FIRSTDATE=1 131 | var SERIES_LASTBAR_DATE=5 132 | var SERIES_SERVER_FIRSTDATE=2 133 | var SIGNAL_BASE_BALANCE=17 134 | var SIGNAL_BASE_EQUITY=19 135 | var SIGNAL_BASE_GAIN=16 136 | var SIGNAL_BASE_MAX_DRAWDOWN=18 137 | var SIGNAL_BASE_PRICE=15 138 | var SIGNAL_BASE_ROI=20 139 | var SIGNAL_BASE_DATE_PUBLISHED=1 140 | var SIGNAL_BASE_DATE_STARTED=2 141 | var SIGNAL_BASE_ID=0 142 | var SIGNAL_BASE_LEVERAGE=6 143 | var SIGNAL_BASE_PIPS=8 144 | var SIGNAL_BASE_RATING=9 145 | var SIGNAL_BASE_SUBSCRIBERS=4 146 | var SIGNAL_BASE_TRADE_MODE=5 147 | var SIGNAL_BASE_TRADES=7 148 | var SIGNAL_BASE_AUTHOR_LOGIN=13 149 | var SIGNAL_BASE_BROKER=10 150 | var SIGNAL_BASE_BROKER_SERVER=11 151 | var SIGNAL_BASE_CURRENCY=14 152 | var SIGNAL_BASE_NAME=12 153 | var SIGNAL_INFO_EQUITY_LIMIT=8 154 | var SIGNAL_INFO_SLIPPAGE=9 155 | var SIGNAL_INFO_VOLUME_PERCENT=7 156 | var SIGNAL_INFO_CONFIRMATIONS_DISABLED=4 157 | var SIGNAL_INFO_COPY_SLTP=3 158 | var SIGNAL_INFO_DEPOSIT_PERCENT=5 159 | var SIGNAL_INFO_ID=0 160 | var SIGNAL_INFO_SUBSCRIPTION_ENABLED=1 161 | var SIGNAL_INFO_TERMS_AGREE=2 162 | var SIGNAL_INFO_NAME=6 163 | var MODE_EMA=1 164 | var MODE_LWMA=3 165 | var MODE_SMA=0 166 | var MODE_SMMA=2 167 | var SYMBOL_ASK=4 168 | var SYMBOL_ASKHIGH=5 169 | var SYMBOL_ASKLOW=6 170 | var SYMBOL_BID=1 171 | var SYMBOL_BIDHIGH=2 172 | var SYMBOL_BIDLOW=3 173 | var SYMBOL_LAST=7 174 | var SYMBOL_LASTHIGH=8 175 | var SYMBOL_LASTLOW=9 176 | var SYMBOL_MARGIN_INITIAL=42 177 | var SYMBOL_MARGIN_LIMIT=46 178 | var SYMBOL_MARGIN_LONG=44 179 | var SYMBOL_MARGIN_MAINTENANCE=43 180 | var SYMBOL_MARGIN_SHORT=45 181 | var SYMBOL_MARGIN_STOP=47 182 | var SYMBOL_MARGIN_STOPLIMIT=48 183 | var SYMBOL_POINT=16 184 | var SYMBOL_SESSION_AW=66 185 | var SYMBOL_SESSION_BUY_ORDERS_VOLUME=61 186 | var SYMBOL_SESSION_CLOSE=65 187 | var SYMBOL_SESSION_INTEREST=59 188 | var SYMBOL_SESSION_OPEN=64 189 | var SYMBOL_SESSION_PRICE_LIMIT_MAX=69 190 | var SYMBOL_SESSION_PRICE_LIMIT_MIN=68 191 | var SYMBOL_SESSION_PRICE_SETTLEMENT=67 192 | var SYMBOL_SESSION_SELL_ORDERS_VOLUME=63 193 | var SYMBOL_SESSION_TURNOVER=58 194 | var SYMBOL_SESSION_VOLUME=57 195 | var SYMBOL_SWAP_LONG=38 196 | var SYMBOL_SWAP_SHORT=39 197 | var SYMBOL_TRADE_CONTRACT_SIZE=28 198 | var SYMBOL_TRADE_TICK_SIZE=27 199 | var SYMBOL_TRADE_TICK_VALUE=26 200 | var SYMBOL_TRADE_TICK_VALUE_LOSS=54 201 | var SYMBOL_TRADE_TICK_VALUE_PROFIT=53 202 | var SYMBOL_VOLUME_LIMIT=55 203 | var SYMBOL_VOLUME_MAX=35 204 | var SYMBOL_VOLUME_MIN=34 205 | var SYMBOL_VOLUME_STEP=36 206 | var SYMBOL_DIGITS=17 207 | var SYMBOL_EXPIRATION_MODE=49 208 | var SYMBOL_EXPIRATION_TIME=52 209 | var SYMBOL_FILLING_MODE=50 210 | var SYMBOL_ORDER_MODE=71 211 | var SYMBOL_SELECT=0 212 | var SYMBOL_SESSION_BUY_ORDERS=60 213 | var SYMBOL_SESSION_DEALS=56 214 | var SYMBOL_SESSION_SELL_ORDERS=62 215 | var SYMBOL_SPREAD=18 216 | var SYMBOL_SPREAD_FLOAT=41 217 | var SYMBOL_START_TIME=51 218 | var SYMBOL_SWAP_MODE=37 219 | var SYMBOL_SWAP_ROLLOVER3DAYS=40 220 | var SYMBOL_TIME=15 221 | var SYMBOL_TRADE_CALC_MODE=29 222 | var SYMBOL_TRADE_EXECUTION_EXCHANGE=3 223 | var SYMBOL_TRADE_EXECUTION_INSTANT=1 224 | var SYMBOL_TRADE_EXECUTION_MARKET=2 225 | var SYMBOL_TRADE_EXECUTION_REQUEST=0 226 | var SYMBOL_TRADE_EXEMODE=33 227 | var SYMBOL_TRADE_FREEZE_LEVEL=32 228 | var SYMBOL_TRADE_MODE=30 229 | var SYMBOL_TRADE_MODE_CLOSEONLY=1 230 | var SYMBOL_TRADE_MODE_DISABLED=0 231 | var SYMBOL_TRADE_MODE_FULL=2 232 | var SYMBOL_TRADE_MODE_LONGONLY=3 233 | var SYMBOL_TRADE_MODE_SHORTONLY=4 234 | var SYMBOL_TRADE_STOPS_LEVEL=31 235 | var SYMBOL_VOLUME=10 236 | var SYMBOL_VOLUMEHIGH=11 237 | var SYMBOL_VOLUMELOW=12 238 | var FRIDAY=5 239 | var MONDAY=1 240 | var SATURDAY=6 241 | var SUNDAY=0 242 | var THURSDAY=4 243 | var TUESDAY=2 244 | var WEDNESDAY=3 245 | var SYMBOL_CURRENCY_BASE=22 246 | var SYMBOL_CURRENCY_MARGIN=24 247 | var SYMBOL_CURRENCY_PROFIT=23 248 | var SYMBOL_DESCRIPTION=20 249 | var SYMBOL_PATH=21 250 | -------------------------------------------------------------------------------- /files/MQL4/Files/test.txt: -------------------------------------------------------------------------------- 1 | var ACCOUNT_BALANCE=37 2 | var ACCOUNT_COMPANY=2 3 | var ACCOUNT_CREDIT=38 4 | var ACCOUNT_CURRENCY=36 5 | var ACCOUNT_EQUITY=40 6 | var ACCOUNT_FREEMARGIN=42 7 | var ACCOUNT_LEVERAGE=35 8 | var ACCOUNT_LIMIT_ORDERS=47 9 | var ACCOUNT_LOGIN=0 10 | var ACCOUNT_MARGIN=41 11 | var ACCOUNT_MARGIN_LEVEL=43 12 | var ACCOUNT_MARGIN_SO_CALL=45 13 | var ACCOUNT_MARGIN_SO_MODE=44 14 | var ACCOUNT_MARGIN_SO_SO=46 15 | var ACCOUNT_NAME=1 16 | var ACCOUNT_PROFIT=39 17 | var ACCOUNT_SERVER=3 18 | var ACCOUNT_STOPOUT_MODE_MONEY=1 19 | var ACCOUNT_STOPOUT_MODE_PERCENT=0 20 | var ACCOUNT_TRADE_ALLOWED=33 21 | var ACCOUNT_TRADE_EXPERT=34 22 | var ACCOUNT_TRADE_MODE=32 23 | var ACCOUNT_TRADE_MODE_CONTEST=1 24 | var ACCOUNT_TRADE_MODE_DEMO=0 25 | var ACCOUNT_TRADE_MODE_REAL=2 26 | var TIME_DATE=1 27 | var TIME_MINUTES=2 28 | var TIME_SECONDS=4 29 | var PERIOD_CURRENT=0 30 | var PERIOD_D1=1440 31 | var PERIOD_H1=60 32 | var PERIOD_H12=720 33 | var PERIOD_H2=120 34 | var PERIOD_H3=180 35 | var PERIOD_H4=240 36 | var PERIOD_H6=360 37 | var PERIOD_H8=480 38 | var PERIOD_M1=1 39 | var PERIOD_M10=10 40 | var PERIOD_M12=12 41 | var PERIOD_M15=15 42 | var PERIOD_M2=2 43 | var PERIOD_M20=20 44 | var PERIOD_M3=3 45 | var PERIOD_M30=30 46 | var PERIOD_M4=4 47 | var PERIOD_M5=5 48 | var PERIOD_M6=6 49 | var PERIOD_MN1=43200 50 | var PERIOD_W1=10080 51 | var INDICATOR_DIGITS=0 52 | var INDICATOR_HEIGHT=10 53 | var INDICATOR_LEVELCOLOR=5 54 | var INDICATOR_LEVELS=4 55 | var INDICATOR_LEVELSTYLE=6 56 | var INDICATOR_LEVELTEXT=9 57 | var INDICATOR_LEVELVALUE=8 58 | var INDICATOR_LEVELWIDTH=7 59 | var INDICATOR_MAXIMUM=3 60 | var INDICATOR_MINIMUM=2 61 | var INDICATOR_SHORTNAME=1 62 | var WHOLE_ARRAY=0 63 | var GANN_DOWN_TREND=1 64 | var GANN_UP_TREND=0 65 | var MODE_CHIKOUSPAN=5 66 | var MODE_GATORJAW=1 67 | var MODE_GATORLIPS=3 68 | var MODE_GATORTEETH=2 69 | var MODE_KIJUNSEN=2 70 | var MODE_LOWER=2 71 | var MODE_MAIN=0 72 | var MODE_MINUSDI=2 73 | var MODE_PLUSDI=1 74 | var MODE_SENKOUSPANA=3 75 | var MODE_SENKOUSPANB=4 76 | var MODE_SIGNAL=1 77 | var MODE_TENKANSEN=1 78 | var MODE_UPPER=1 79 | var STO_CLOSECLOSE=1 80 | var STO_LOWHIGH=0 81 | var MODE_ASK=10 82 | var MODE_BID=9 83 | var MODE_DIGITS=12 84 | var MODE_EXPIRATION=21 85 | var MODE_FREEZELEVEL=33 86 | var MODE_LOTSIZE=15 87 | var MODE_LOTSTEP=24 88 | var MODE_MARGINCALCMODE=28 89 | var MODE_MARGINHEDGED=31 90 | var MODE_MARGININIT=29 91 | var MODE_MARGINMAINTENANCE=30 92 | var MODE_MARGINREQUIRED=32 93 | var MODE_MAXLOT=25 94 | var MODE_MINLOT=23 95 | var MODE_POINT=11 96 | var MODE_PROFITCALCMODE=27 97 | var MODE_SPREAD=13 98 | var MODE_STARTING=20 99 | var MODE_STOPLEVEL=14 100 | var MODE_SWAPLONG=18 101 | var MODE_SWAPSHORT=19 102 | var MODE_SWAPTYPE=26 103 | var MODE_TICKSIZE=17 104 | var MODE_TICKVALUE=16 105 | var MODE_TRADEALLOWED=22 106 | var MODE_HISTORY=1 107 | var MODE_TRADES=0 108 | var SELECT_BY_POS=0 109 | var SELECT_BY_TICKET=1 110 | var OP_BUY=0 111 | var OP_BUYLIMIT=2 112 | var OP_BUYSTOP=4 113 | var OP_SELL=1 114 | var OP_SELLLIMIT=3 115 | var OP_SELLSTOP=5 116 | var PRICE_CLOSE=0 117 | var PRICE_HIGH=2 118 | var PRICE_LOW=3 119 | var PRICE_MEDIAN=4 120 | var PRICE_OPEN=1 121 | var PRICE_TYPICAL=5 122 | var PRICE_WEIGHTED=6 123 | var MODE_CLOSE=3 124 | var MODE_HIGH=2 125 | var MODE_LOW=1 126 | var MODE_OPEN=0 127 | var MODE_TIME=5 128 | var MODE_VOLUME=4 129 | var SERIES_BARS_COUNT=0 130 | var SERIES_FIRSTDATE=1 131 | var SERIES_LASTBAR_DATE=5 132 | var SERIES_SERVER_FIRSTDATE=2 133 | var SIGNAL_BASE_BALANCE=17 134 | var SIGNAL_BASE_EQUITY=19 135 | var SIGNAL_BASE_GAIN=16 136 | var SIGNAL_BASE_MAX_DRAWDOWN=18 137 | var SIGNAL_BASE_PRICE=15 138 | var SIGNAL_BASE_ROI=20 139 | var SIGNAL_BASE_DATE_PUBLISHED=1 140 | var SIGNAL_BASE_DATE_STARTED=2 141 | var SIGNAL_BASE_ID=0 142 | var SIGNAL_BASE_LEVERAGE=6 143 | var SIGNAL_BASE_PIPS=8 144 | var SIGNAL_BASE_RATING=9 145 | var SIGNAL_BASE_SUBSCRIBERS=4 146 | var SIGNAL_BASE_TRADE_MODE=5 147 | var SIGNAL_BASE_TRADES=7 148 | var SIGNAL_BASE_AUTHOR_LOGIN=13 149 | var SIGNAL_BASE_BROKER=10 150 | var SIGNAL_BASE_BROKER_SERVER=11 151 | var SIGNAL_BASE_CURRENCY=14 152 | var SIGNAL_BASE_NAME=12 153 | var SIGNAL_INFO_EQUITY_LIMIT=8 154 | var SIGNAL_INFO_SLIPPAGE=9 155 | var SIGNAL_INFO_VOLUME_PERCENT=7 156 | var SIGNAL_INFO_CONFIRMATIONS_DISABLED=4 157 | var SIGNAL_INFO_COPY_SLTP=3 158 | var SIGNAL_INFO_DEPOSIT_PERCENT=5 159 | var SIGNAL_INFO_ID=0 160 | var SIGNAL_INFO_SUBSCRIPTION_ENABLED=1 161 | var SIGNAL_INFO_TERMS_AGREE=2 162 | var SIGNAL_INFO_NAME=6 163 | var MODE_EMA=1 164 | var MODE_LWMA=3 165 | var MODE_SMA=0 166 | var MODE_SMMA=2 167 | var SYMBOL_ASK=4 168 | var SYMBOL_ASKHIGH=5 169 | var SYMBOL_ASKLOW=6 170 | var SYMBOL_BID=1 171 | var SYMBOL_BIDHIGH=2 172 | var SYMBOL_BIDLOW=3 173 | var SYMBOL_LAST=7 174 | var SYMBOL_LASTHIGH=8 175 | var SYMBOL_LASTLOW=9 176 | var SYMBOL_MARGIN_INITIAL=42 177 | var SYMBOL_MARGIN_LIMIT=46 178 | var SYMBOL_MARGIN_LONG=44 179 | var SYMBOL_MARGIN_MAINTENANCE=43 180 | var SYMBOL_MARGIN_SHORT=45 181 | var SYMBOL_MARGIN_STOP=47 182 | var SYMBOL_MARGIN_STOPLIMIT=48 183 | var SYMBOL_POINT=16 184 | var SYMBOL_SESSION_AW=66 185 | var SYMBOL_SESSION_BUY_ORDERS_VOLUME=61 186 | var SYMBOL_SESSION_CLOSE=65 187 | var SYMBOL_SESSION_INTEREST=59 188 | var SYMBOL_SESSION_OPEN=64 189 | var SYMBOL_SESSION_PRICE_LIMIT_MAX=69 190 | var SYMBOL_SESSION_PRICE_LIMIT_MIN=68 191 | var SYMBOL_SESSION_PRICE_SETTLEMENT=67 192 | var SYMBOL_SESSION_SELL_ORDERS_VOLUME=63 193 | var SYMBOL_SESSION_TURNOVER=58 194 | var SYMBOL_SESSION_VOLUME=57 195 | var SYMBOL_SWAP_LONG=38 196 | var SYMBOL_SWAP_SHORT=39 197 | var SYMBOL_TRADE_CONTRACT_SIZE=28 198 | var SYMBOL_TRADE_TICK_SIZE=27 199 | var SYMBOL_TRADE_TICK_VALUE=26 200 | var SYMBOL_TRADE_TICK_VALUE_LOSS=54 201 | var SYMBOL_TRADE_TICK_VALUE_PROFIT=53 202 | var SYMBOL_VOLUME_LIMIT=55 203 | var SYMBOL_VOLUME_MAX=35 204 | var SYMBOL_VOLUME_MIN=34 205 | var SYMBOL_VOLUME_STEP=36 206 | var SYMBOL_DIGITS=17 207 | var SYMBOL_EXPIRATION_MODE=49 208 | var SYMBOL_EXPIRATION_TIME=52 209 | var SYMBOL_FILLING_MODE=50 210 | var SYMBOL_ORDER_MODE=71 211 | var SYMBOL_SELECT=0 212 | var SYMBOL_SESSION_BUY_ORDERS=60 213 | var SYMBOL_SESSION_DEALS=56 214 | var SYMBOL_SESSION_SELL_ORDERS=62 215 | var SYMBOL_SPREAD=18 216 | var SYMBOL_SPREAD_FLOAT=41 217 | var SYMBOL_START_TIME=51 218 | var SYMBOL_SWAP_MODE=37 219 | var SYMBOL_SWAP_ROLLOVER3DAYS=40 220 | var SYMBOL_TIME=15 221 | var SYMBOL_TRADE_CALC_MODE=29 222 | var SYMBOL_TRADE_EXECUTION_EXCHANGE=3 223 | var SYMBOL_TRADE_EXECUTION_INSTANT=1 224 | var SYMBOL_TRADE_EXECUTION_MARKET=2 225 | var SYMBOL_TRADE_EXECUTION_REQUEST=0 226 | var SYMBOL_TRADE_EXEMODE=33 227 | var SYMBOL_TRADE_FREEZE_LEVEL=32 228 | var SYMBOL_TRADE_MODE=30 229 | var SYMBOL_TRADE_MODE_CLOSEONLY=1 230 | var SYMBOL_TRADE_MODE_DISABLED=0 231 | var SYMBOL_TRADE_MODE_FULL=2 232 | var SYMBOL_TRADE_MODE_LONGONLY=3 233 | var SYMBOL_TRADE_MODE_SHORTONLY=4 234 | var SYMBOL_TRADE_STOPS_LEVEL=31 235 | var SYMBOL_VOLUME=10 236 | var SYMBOL_VOLUMEHIGH=11 237 | var SYMBOL_VOLUMELOW=12 238 | var FRIDAY=5 239 | var MONDAY=1 240 | var SATURDAY=6 241 | var SUNDAY=0 242 | var THURSDAY=4 243 | var TUESDAY=2 244 | var WEDNESDAY=3 245 | var SYMBOL_CURRENCY_BASE=22 246 | var SYMBOL_CURRENCY_MARGIN=24 247 | var SYMBOL_CURRENCY_PROFIT=23 248 | var SYMBOL_DESCRIPTION=20 249 | var SYMBOL_PATH=21 250 | -------------------------------------------------------------------------------- /files/MQL4/Include/Arrays/Array.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Array.mqh | 3 | //| Copyright 2009-2015, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | //+------------------------------------------------------------------+ 6 | #include 7 | //+------------------------------------------------------------------+ 8 | //| Class CArray | 9 | //| Purpose: Base class of dynamic arrays. | 10 | //| Derives from class CObject. | 11 | //+------------------------------------------------------------------+ 12 | class CArray : public CObject 13 | { 14 | protected: 15 | int m_step_resize; // increment size of the array 16 | int m_data_total; // number of elements 17 | int m_data_max; // maximmum size of the array without memory reallocation 18 | int m_sort_mode; // mode of array sorting 19 | 20 | public: 21 | CArray(void); 22 | ~CArray(void); 23 | //--- methods of access to protected data 24 | int Step(void) const { return(m_step_resize); } 25 | bool Step(const int step); 26 | int Total(void) const { return(m_data_total); } 27 | int Available(void) const { return(m_data_max-m_data_total); } 28 | int Max(void) const { return(m_data_max); } 29 | bool IsSorted(const int mode=0) const { return(m_sort_mode==mode); } 30 | int SortMode(void) const { return(m_sort_mode); } 31 | //--- cleaning method 32 | void Clear(void) { m_data_total=0; } 33 | //--- methods for working with files 34 | virtual bool Save(const int file_handle); 35 | virtual bool Load(const int file_handle); 36 | //--- sorting method 37 | void Sort(const int mode=0); 38 | 39 | protected: 40 | virtual void QuickSort(int beg,int end,const int mode=0) { m_sort_mode=-1; } 41 | //--- templates for methods of searching for minimum and maximum 42 | template 43 | int Minimum(const T &data[],const int start,const int count) const; 44 | template 45 | int Maximum(const T &data[],const int start,const int count) const; 46 | }; 47 | //+------------------------------------------------------------------+ 48 | //| Constructor | 49 | //+------------------------------------------------------------------+ 50 | CArray::CArray(void) : m_step_resize(16), 51 | m_data_total(0), 52 | m_data_max(0), 53 | m_sort_mode(-1) 54 | { 55 | } 56 | //+------------------------------------------------------------------+ 57 | //| Destructor | 58 | //+------------------------------------------------------------------+ 59 | CArray::~CArray(void) 60 | { 61 | } 62 | //+------------------------------------------------------------------+ 63 | //| Method Set for variable m_step_resize | 64 | //+------------------------------------------------------------------+ 65 | bool CArray::Step(const int step) 66 | { 67 | //--- check 68 | if(step>0) 69 | { 70 | m_step_resize=step; 71 | return(true); 72 | } 73 | //--- failure 74 | return(false); 75 | } 76 | //+------------------------------------------------------------------+ 77 | //| Sorting an array in ascending order | 78 | //+------------------------------------------------------------------+ 79 | void CArray::Sort(const int mode) 80 | { 81 | //--- check 82 | if(IsSorted(mode)) 83 | return; 84 | m_sort_mode=mode; 85 | if(m_data_total<=1) 86 | return; 87 | //--- sort 88 | QuickSort(0,m_data_total-1,mode); 89 | } 90 | //+------------------------------------------------------------------+ 91 | //| Writing header of array to file | 92 | //+------------------------------------------------------------------+ 93 | bool CArray::Save(const int file_handle) 94 | { 95 | //--- check handle 96 | if(file_handle!=INVALID_HANDLE) 97 | { 98 | //--- write start marker - 0xFFFFFFFFFFFFFFFF 99 | if(FileWriteLong(file_handle,-1)==sizeof(long)) 100 | { 101 | //--- write array type 102 | if(FileWriteInteger(file_handle,Type(),INT_VALUE)==INT_VALUE) 103 | return(true); 104 | } 105 | } 106 | //--- failure 107 | return(false); 108 | } 109 | //+------------------------------------------------------------------+ 110 | //| Reading header of array from file | 111 | //+------------------------------------------------------------------+ 112 | bool CArray::Load(const int file_handle) 113 | { 114 | //--- check handle 115 | if(file_handle!=INVALID_HANDLE) 116 | { 117 | //--- read and check start marker - 0xFFFFFFFFFFFFFFFF 118 | if(FileReadLong(file_handle)==-1) 119 | { 120 | //--- read and check array type 121 | if(FileReadInteger(file_handle,INT_VALUE)==Type()) 122 | return(true); 123 | } 124 | } 125 | //--- failure 126 | return(false); 127 | } 128 | //+------------------------------------------------------------------+ 129 | //| Find minimum of array | 130 | //+------------------------------------------------------------------+ 131 | template 132 | int CArray::Minimum(const T &data[],const int start,const int count) const 133 | { 134 | int real_count; 135 | //--- check 136 | if(m_data_total<1) 137 | { 138 | SetUserError(ERR_USER_ARRAY_IS_EMPTY); 139 | return(-1); 140 | } 141 | //--- compute count of elements 142 | real_count=(count==WHOLE_ARRAY || count>m_data_total) ? m_data_total : count; 143 | #ifdef __MQL5__ 144 | return(ArrayMinimum(data,start,real_count)); 145 | #else 146 | return(ArrayMinimum(data,real_count,start)); 147 | #endif 148 | } 149 | //+------------------------------------------------------------------+ 150 | //| Find maximum of array | 151 | //+------------------------------------------------------------------+ 152 | template 153 | int CArray::Maximum(const T &data[],const int start,const int count) const 154 | { 155 | int real_count; 156 | //--- check 157 | if(m_data_total<1) 158 | { 159 | SetUserError(ERR_USER_ARRAY_IS_EMPTY); 160 | return(-1); 161 | } 162 | //--- compute count of elements 163 | real_count=(count==WHOLE_ARRAY || count>m_data_total) ? m_data_total : count; 164 | #ifdef __MQL5__ 165 | return(ArrayMaximum(data,start,real_count)); 166 | #else 167 | return(ArrayMaximum(data,real_count,start)); 168 | #endif 169 | } 170 | //+------------------------------------------------------------------+ 171 | -------------------------------------------------------------------------------- /files/MQL4/Include/Arrays/TreeNode.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| TreeNode.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | //+------------------------------------------------------------------+ 6 | #include 7 | //+------------------------------------------------------------------+ 8 | //| Class CTreeNode. | 9 | //| Purpose: Base class of node of binary tree CTree. | 10 | //| Derives from class CObject. | 11 | //+------------------------------------------------------------------+ 12 | class CTreeNode : public CObject 13 | { 14 | private: 15 | CTreeNode *m_p_node; // link to node up 16 | CTreeNode *m_l_node; // link to node left 17 | CTreeNode *m_r_node; // link to node right 18 | //--- variables 19 | int m_balance; // balance of node 20 | int m_l_balance; // balance of the left branch 21 | int m_r_balance; // balance of the right branch 22 | 23 | public: 24 | CTreeNode(void); 25 | ~CTreeNode(void); 26 | //--- methods of access to protected data 27 | CTreeNode* Parent(void) const { return(m_p_node); } 28 | void Parent(CTreeNode *node) { m_p_node=node; } 29 | CTreeNode* Left(void) const { return(m_l_node); } 30 | void Left(CTreeNode *node) { m_l_node=node; } 31 | CTreeNode* Right(void) const { return(m_r_node); } 32 | void Right(CTreeNode *node) { m_r_node=node; } 33 | int Balance(void) const { return(m_balance); } 34 | int BalanceL(void) const { return(m_l_balance); } 35 | int BalanceR(void) const { return(m_r_balance); } 36 | //--- method of identifying the object 37 | virtual int Type(void) const { return(0x8888); } 38 | //--- methods for controlling 39 | int RefreshBalance(void); 40 | CTreeNode *GetNext(const CTreeNode *node); 41 | //--- methods for working with files 42 | bool SaveNode(const int file_handle); 43 | bool LoadNode(const int file_handle,CTreeNode *main); 44 | 45 | protected: 46 | //--- method for creating an instance of class 47 | virtual CTreeNode *CreateSample(void) { return(NULL); } 48 | }; 49 | //+------------------------------------------------------------------+ 50 | //| Constructor | 51 | //+------------------------------------------------------------------+ 52 | CTreeNode::CTreeNode(void) : m_p_node(NULL), 53 | m_l_node(NULL), 54 | m_r_node(NULL), 55 | m_balance(0), 56 | m_l_balance(0), 57 | m_r_balance(0) 58 | { 59 | } 60 | //+------------------------------------------------------------------+ 61 | //| Destructor | 62 | //+------------------------------------------------------------------+ 63 | CTreeNode::~CTreeNode(void) 64 | { 65 | //--- delete nodes of the next level 66 | if(m_l_node!=NULL) 67 | delete m_l_node; 68 | if(m_r_node!=NULL) 69 | delete m_r_node; 70 | } 71 | //+------------------------------------------------------------------+ 72 | //| Calculating the balance of the node | 73 | //+------------------------------------------------------------------+ 74 | int CTreeNode::RefreshBalance(void) 75 | { 76 | //--- calculate the balance of the left branch 77 | if(m_l_node==NULL) 78 | m_l_balance=0; 79 | else 80 | m_l_balance=m_l_node.RefreshBalance(); 81 | //--- calculate the balance of the right branch 82 | if(m_r_node==NULL) 83 | m_r_balance=0; 84 | else 85 | m_r_balance=m_r_node.RefreshBalance(); 86 | //--- calculate the balance of the node 87 | if(m_r_balance>m_l_balance) 88 | m_balance=m_r_balance+1; 89 | else 90 | m_balance=m_l_balance+1; 91 | //--- result 92 | return(m_balance); 93 | } 94 | //+------------------------------------------------------------------+ 95 | //| Selecting next node | 96 | //+------------------------------------------------------------------+ 97 | CTreeNode *CTreeNode::GetNext(const CTreeNode *node) 98 | { 99 | if(Compare(node)>0) 100 | return(m_l_node); 101 | //--- result 102 | return(m_r_node); 103 | } 104 | //+------------------------------------------------------------------+ 105 | //| Writing node data to file | 106 | //+------------------------------------------------------------------+ 107 | bool CTreeNode::SaveNode(const int file_handle) 108 | { 109 | bool result=true; 110 | //--- check 111 | if(file_handle==INVALID_HANDLE) 112 | return(false); 113 | //--- write left node (if it is available) 114 | if(m_l_node!=NULL) 115 | { 116 | FileWriteInteger(file_handle,'L',SHORT_VALUE); 117 | result&=m_l_node.SaveNode(file_handle); 118 | } 119 | else 120 | FileWriteInteger(file_handle,'X',SHORT_VALUE); 121 | //--- write data of current node 122 | result&=Save(file_handle); 123 | //--- write right node (if it is available) 124 | if(m_r_node!=NULL) 125 | { 126 | FileWriteInteger(file_handle,'R',SHORT_VALUE); 127 | result&=m_r_node.SaveNode(file_handle); 128 | } 129 | else 130 | FileWriteInteger(file_handle,'X',SHORT_VALUE); 131 | //--- successful 132 | return(true); 133 | } 134 | //+------------------------------------------------------------------+ 135 | //| Reading node data from file | 136 | //+------------------------------------------------------------------+ 137 | bool CTreeNode::LoadNode(const int file_handle,CTreeNode *main) 138 | { 139 | bool result=true; 140 | short s_val; 141 | CTreeNode *node; 142 | //--- check 143 | if(file_handle==INVALID_HANDLE) 144 | return(false); 145 | //--- read directions 146 | s_val=(short)FileReadInteger(file_handle,SHORT_VALUE); 147 | if(s_val=='L') 148 | { 149 | //--- read left node (if there is data) 150 | node=CreateSample(); 151 | if(node==NULL) 152 | return(false); 153 | m_l_node=node; 154 | node.Parent(main); 155 | result&=node.LoadNode(file_handle,node); 156 | } 157 | //--- read data of current node 158 | result&=Load(file_handle); 159 | //--- read directions 160 | s_val=(short)FileReadInteger(file_handle,SHORT_VALUE); 161 | if(s_val=='R') 162 | { 163 | //--- read right node (if there is data) 164 | node=CreateSample(); 165 | if(node==NULL) 166 | return(false); 167 | m_r_node=node; 168 | node.Parent(main); 169 | result&=node.LoadNode(file_handle,node); 170 | } 171 | //--- result 172 | return(result); 173 | } 174 | //+------------------------------------------------------------------+ 175 | -------------------------------------------------------------------------------- /files/MQL4/Include/Canvas/Canvas.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Canvas/Canvas.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/ChartObjects/ChartObjectsShapes.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| ChartObjectsShapes.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | //| All shapes. | 7 | //+------------------------------------------------------------------+ 8 | #include "ChartObject.mqh" 9 | //+------------------------------------------------------------------+ 10 | //| Class CChartObjectRectangle. | 11 | //| Purpose: Class of the "Rectangle" object of chart. | 12 | //| Derives from class CChartObject. | 13 | //+------------------------------------------------------------------+ 14 | class CChartObjectRectangle : public CChartObject 15 | { 16 | public: 17 | CChartObjectRectangle(void); 18 | ~CChartObjectRectangle(void); 19 | //--- method of creating the object 20 | bool Create(long chart_id,const string name,const int window, 21 | const datetime time1,const double price1, 22 | const datetime time2,const double price2); 23 | //--- method of identifying the object 24 | virtual int Type(void) const { return(OBJ_RECTANGLE); } 25 | }; 26 | //+------------------------------------------------------------------+ 27 | //| Constructor | 28 | //+------------------------------------------------------------------+ 29 | CChartObjectRectangle::CChartObjectRectangle(void) 30 | { 31 | } 32 | //+------------------------------------------------------------------+ 33 | //| Destructor | 34 | //+------------------------------------------------------------------+ 35 | CChartObjectRectangle::~CChartObjectRectangle(void) 36 | { 37 | } 38 | //+------------------------------------------------------------------+ 39 | //| Create object "Rectangle" | 40 | //+------------------------------------------------------------------+ 41 | bool CChartObjectRectangle::Create(long chart_id,const string name,const int window, 42 | const datetime time1,const double price1, 43 | const datetime time2,const double price2) 44 | { 45 | if(!ObjectCreate(chart_id,name,OBJ_RECTANGLE,window,time1,price1,time2,price2)) 46 | return(false); 47 | if(!Attach(chart_id,name,window,2)) 48 | return(false); 49 | //--- successful 50 | return(true); 51 | } 52 | //+------------------------------------------------------------------+ 53 | //| Class CChartObjectTriangle. | 54 | //| Purpose: Class of the "Triangle" object of chart. | 55 | //| Derives from class CChartObject. | 56 | //+------------------------------------------------------------------+ 57 | class CChartObjectTriangle : public CChartObject 58 | { 59 | public: 60 | CChartObjectTriangle(void); 61 | ~CChartObjectTriangle(void); 62 | //--- method of creating the object 63 | bool Create(long chart_id,const string name,const int window, 64 | const datetime time1,const double price1, 65 | const datetime time2,const double price2, 66 | const datetime time3,const double price3); 67 | //--- method of identifying the object 68 | virtual int Type(void) const { return(OBJ_TRIANGLE); } 69 | }; 70 | //+------------------------------------------------------------------+ 71 | //| Constructor | 72 | //+------------------------------------------------------------------+ 73 | CChartObjectTriangle::CChartObjectTriangle(void) 74 | { 75 | } 76 | //+------------------------------------------------------------------+ 77 | //| Destructor | 78 | //+------------------------------------------------------------------+ 79 | CChartObjectTriangle::~CChartObjectTriangle(void) 80 | { 81 | } 82 | //+------------------------------------------------------------------+ 83 | //| Create object "Triangle" | 84 | //+------------------------------------------------------------------+ 85 | bool CChartObjectTriangle::Create(long chart_id,const string name,const int window, 86 | const datetime time1,const double price1, 87 | const datetime time2,const double price2, 88 | const datetime time3,const double price3) 89 | { 90 | if(!ObjectCreate(chart_id,name,OBJ_TRIANGLE,window,time1,price1,time2,price2,time3,price3)) 91 | return(false); 92 | if(!Attach(chart_id,name,window,3)) 93 | return(false); 94 | //--- successful 95 | return(true); 96 | } 97 | //+------------------------------------------------------------------+ 98 | //| Class CChartObjectEllipse. | 99 | //| Purpose: Class of the "Ellipse" object of chart. | 100 | //| Derives from class CChartObject. | 101 | //+------------------------------------------------------------------+ 102 | class CChartObjectEllipse : public CChartObject 103 | { 104 | public: 105 | CChartObjectEllipse(void); 106 | ~CChartObjectEllipse(void); 107 | //--- method of creating the object 108 | bool Create(long chart_id,const string name,const int window, 109 | const datetime time1,const double price1, 110 | const datetime time2,const double price2, 111 | const datetime time3,const double price3); 112 | //--- method of identifying the object 113 | virtual int Type(void) const { return(OBJ_ELLIPSE); } 114 | }; 115 | //+------------------------------------------------------------------+ 116 | //| Constructor | 117 | //+------------------------------------------------------------------+ 118 | CChartObjectEllipse::CChartObjectEllipse(void) 119 | { 120 | } 121 | //+------------------------------------------------------------------+ 122 | //| Destructor | 123 | //+------------------------------------------------------------------+ 124 | CChartObjectEllipse::~CChartObjectEllipse(void) 125 | { 126 | } 127 | //+------------------------------------------------------------------+ 128 | //| Create object "Ellipse" | 129 | //+------------------------------------------------------------------+ 130 | bool CChartObjectEllipse::Create(long chart_id,const string name,const int window, 131 | const datetime time1,const double price1, 132 | const datetime time2,const double price2, 133 | const datetime time3,const double price3) 134 | { 135 | if(!ObjectCreate(chart_id,name,OBJ_ELLIPSE,window,time1,price1,time2,price2,time3,price3)) 136 | return(false); 137 | if(!Attach(chart_id,name,window,3)) 138 | return(false); 139 | //--- successful 140 | return(true); 141 | } 142 | //+------------------------------------------------------------------+ 143 | -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/BmpButton.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/BmpButton.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/Button.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/Button.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/CheckBox.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| CheckBox.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #include "WndContainer.mqh" 7 | #include "BmpButton.mqh" 8 | #include "Edit.mqh" 9 | //+------------------------------------------------------------------+ 10 | //| Resources | 11 | //+------------------------------------------------------------------+ 12 | #resource "res\\CheckBoxOn.bmp" 13 | #resource "res\\CheckBoxOff.bmp" 14 | //+------------------------------------------------------------------+ 15 | //| Class CCheckBox | 16 | //| Usage: class that implements the "CheckBox" control | 17 | //+------------------------------------------------------------------+ 18 | class CCheckBox : public CWndContainer 19 | { 20 | private: 21 | //--- dependent controls 22 | CBmpButton m_button; // button object 23 | CEdit m_label; // label object 24 | //--- data 25 | int m_value; // value 26 | 27 | public: 28 | CCheckBox(void); 29 | ~CCheckBox(void); 30 | //--- create 31 | virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); 32 | //--- chart event handler 33 | virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); 34 | //--- settings 35 | string Text(void) const { return(m_label.Text()); } 36 | bool Text(const string value) { return(m_label.Text(value)); } 37 | color Color(void) const { return(m_label.Color()); } 38 | bool Color(const color value) { return(m_label.Color(value)); } 39 | //--- state 40 | bool Checked(void) const { return(m_button.Pressed()); } 41 | bool Checked(const bool flag) { return(m_button.Pressed(flag)); } 42 | //--- data 43 | int Value(void) const { return(m_value); } 44 | void Value(const int value) { m_value=value; } 45 | //--- methods for working with files 46 | virtual bool Save(const int file_handle); 47 | virtual bool Load(const int file_handle); 48 | 49 | protected: 50 | //--- create dependent controls 51 | virtual bool CreateButton(void); 52 | virtual bool CreateLabel(void); 53 | //--- handlers of the dependent controls events 54 | virtual bool OnClickButton(void); 55 | virtual bool OnClickLabel(void); 56 | }; 57 | //+------------------------------------------------------------------+ 58 | //| Common handler of chart events | 59 | //+------------------------------------------------------------------+ 60 | EVENT_MAP_BEGIN(CCheckBox) 61 | ON_EVENT(ON_CLICK,m_button,OnClickButton) 62 | ON_EVENT(ON_CLICK,m_label,OnClickLabel) 63 | EVENT_MAP_END(CWndContainer) 64 | //+------------------------------------------------------------------+ 65 | //| Constructor | 66 | //+------------------------------------------------------------------+ 67 | CCheckBox::CCheckBox(void) : m_value(0) 68 | { 69 | } 70 | //+------------------------------------------------------------------+ 71 | //| Destructor | 72 | //+------------------------------------------------------------------+ 73 | CCheckBox::~CCheckBox(void) 74 | { 75 | } 76 | //+------------------------------------------------------------------+ 77 | //| Create a control | 78 | //+------------------------------------------------------------------+ 79 | bool CCheckBox::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) 80 | { 81 | //--- call method of the parent class 82 | if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2)) 83 | return(false); 84 | //--- create dependent controls 85 | if(!CreateButton()) 86 | return(false); 87 | if(!CreateLabel()) 88 | return(false); 89 | //--- succeeded 90 | return(true); 91 | } 92 | //+------------------------------------------------------------------+ 93 | //| Create button | 94 | //+------------------------------------------------------------------+ 95 | bool CCheckBox::CreateButton(void) 96 | { 97 | //--- calculate coordinates 98 | int x1=CONTROLS_CHECK_BUTTON_X_OFF; 99 | int y1=CONTROLS_CHECK_BUTTON_Y_OFF; 100 | int x2=x1+CONTROLS_BUTTON_SIZE; 101 | int y2=y1+CONTROLS_BUTTON_SIZE-CONTROLS_BORDER_WIDTH; 102 | //--- create 103 | if(!m_button.Create(m_chart_id,m_name+"Button",m_subwin,x1,y1,x2,y2)) 104 | return(false); 105 | if(!m_button.BmpNames("::res\\CheckBoxOff.bmp","::res\\CheckBoxOn.bmp")) 106 | return(false); 107 | if(!Add(m_button)) 108 | return(false); 109 | m_button.Locking(true); 110 | //--- succeeded 111 | return(true); 112 | } 113 | //+------------------------------------------------------------------+ 114 | //| Create label | 115 | //+------------------------------------------------------------------+ 116 | bool CCheckBox::CreateLabel(void) 117 | { 118 | //--- calculate coordinates 119 | int x1=CONTROLS_CHECK_LABEL_X_OFF; 120 | int y1=CONTROLS_CHECK_LABEL_Y_OFF; 121 | int x2=Width(); 122 | int y2=Height(); 123 | //--- create 124 | if(!m_label.Create(m_chart_id,m_name+"Label",m_subwin,x1,y1,x2,y2)) 125 | return(false); 126 | if(!m_label.Text(m_name)) 127 | return(false); 128 | if(!Add(m_label)) 129 | return(false); 130 | m_label.ReadOnly(true); 131 | m_label.ColorBackground(CONTROLS_CHECKGROUP_COLOR_BG); 132 | m_label.ColorBorder(CONTROLS_CHECKGROUP_COLOR_BG); 133 | //--- succeeded 134 | return(true); 135 | } 136 | //+------------------------------------------------------------------+ 137 | //| | 138 | //+------------------------------------------------------------------+ 139 | bool CCheckBox::Save(const int file_handle) 140 | { 141 | //--- check 142 | if(file_handle==INVALID_HANDLE) 143 | return(false); 144 | //--- 145 | FileWriteInteger(file_handle,Checked()); 146 | //--- succeed 147 | return(true); 148 | } 149 | //+------------------------------------------------------------------+ 150 | //| | 151 | //+------------------------------------------------------------------+ 152 | bool CCheckBox::Load(const int file_handle) 153 | { 154 | //--- check 155 | if(file_handle==INVALID_HANDLE) 156 | return(false); 157 | //--- 158 | if(!FileIsEnding(file_handle)) 159 | Checked(FileReadInteger(file_handle)); 160 | //--- succeed 161 | return(true); 162 | } 163 | //+------------------------------------------------------------------+ 164 | //| Handler of click on button | 165 | //+------------------------------------------------------------------+ 166 | bool CCheckBox::OnClickButton(void) 167 | { 168 | //--- send the "changed state" event 169 | EventChartCustom(INTERNAL_EVENT,ON_CHANGE,m_id,0.0,m_name); 170 | //--- handled 171 | return(true); 172 | } 173 | //+------------------------------------------------------------------+ 174 | //| Handler of click on label | 175 | //+------------------------------------------------------------------+ 176 | bool CCheckBox::OnClickLabel(void) 177 | { 178 | //--- change button state 179 | m_button.Pressed(!m_button.Pressed()); 180 | //--- return the result of the button click handler 181 | return(OnClickButton()); 182 | } 183 | //+------------------------------------------------------------------+ 184 | -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/Defines.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/Defines.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/Label.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Label.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #include "WndObj.mqh" 7 | #include 8 | //+------------------------------------------------------------------+ 9 | //| Class CLabel | 10 | //| Usage: control that is displayed by | 11 | //| the CChartObjectLabel object | 12 | //+------------------------------------------------------------------+ 13 | class CLabel : public CWndObj 14 | { 15 | private: 16 | CChartObjectLabel m_label; // chart object 17 | 18 | public: 19 | CLabel(void); 20 | ~CLabel(void); 21 | //--- create 22 | virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); 23 | 24 | protected: 25 | //--- handlers of object settings 26 | virtual bool OnSetText(void) { return(m_label.Description(m_text)); } 27 | virtual bool OnSetColor(void) { return(m_label.Color(m_color)); } 28 | virtual bool OnSetFont(void) { return(m_label.Font(m_font)); } 29 | virtual bool OnSetFontSize(void) { return(m_label.FontSize(m_font_size)); } 30 | //--- internal event handlers 31 | virtual bool OnCreate(void); 32 | virtual bool OnShow(void); 33 | virtual bool OnHide(void); 34 | virtual bool OnMove(void); 35 | }; 36 | //+------------------------------------------------------------------+ 37 | //| Constructor | 38 | //+------------------------------------------------------------------+ 39 | CLabel::CLabel(void) 40 | { 41 | m_color=CONTROLS_LABEL_COLOR; 42 | } 43 | //+------------------------------------------------------------------+ 44 | //| Destructor | 45 | //+------------------------------------------------------------------+ 46 | CLabel::~CLabel(void) 47 | { 48 | } 49 | //+------------------------------------------------------------------+ 50 | //| Create a control | 51 | //+------------------------------------------------------------------+ 52 | bool CLabel::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) 53 | { 54 | //--- call method of the parent class 55 | if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2)) 56 | return(false); 57 | //--- create the chart object 58 | if(!m_label.Create(chart,name,subwin,x1,y1)) 59 | return(false); 60 | //--- call the settings handler 61 | return(OnChange()); 62 | } 63 | //+------------------------------------------------------------------+ 64 | //| Create object on chart | 65 | //+------------------------------------------------------------------+ 66 | bool CLabel::OnCreate(void) 67 | { 68 | //--- create the chart object by previously set parameters 69 | return(m_label.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top)); 70 | } 71 | //+------------------------------------------------------------------+ 72 | //| Display object on chart | 73 | //+------------------------------------------------------------------+ 74 | bool CLabel::OnShow(void) 75 | { 76 | return(m_label.Timeframes(OBJ_ALL_PERIODS)); 77 | } 78 | //+------------------------------------------------------------------+ 79 | //| Hide object from chart | 80 | //+------------------------------------------------------------------+ 81 | bool CLabel::OnHide(void) 82 | { 83 | return(m_label.Timeframes(OBJ_NO_PERIODS)); 84 | } 85 | //+------------------------------------------------------------------+ 86 | //| Absolute movement of the chart object | 87 | //+------------------------------------------------------------------+ 88 | bool CLabel::OnMove(void) 89 | { 90 | //--- position the chart object 91 | return(m_label.X_Distance(m_rect.left) && m_label.Y_Distance(m_rect.top)); 92 | } 93 | //+------------------------------------------------------------------+ 94 | -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/ListView.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/ListView.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/Panel.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Panel.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #include "WndObj.mqh" 7 | #include 8 | //+------------------------------------------------------------------+ 9 | //| Class CPanel | 10 | //| Usage: control that is displayed by | 11 | //| the CChartObjectRectLabel object | 12 | //+------------------------------------------------------------------+ 13 | class CPanel : public CWndObj 14 | { 15 | private: 16 | CChartObjectRectLabel m_rectangle; // chart object 17 | //--- parameters of the chart object 18 | ENUM_BORDER_TYPE m_border; // border type 19 | 20 | public: 21 | CPanel(void); 22 | ~CPanel(void); 23 | //--- create 24 | virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); 25 | //--- parameters of the chart object 26 | ENUM_BORDER_TYPE BorderType(void) const { return(m_border); } 27 | bool BorderType(const ENUM_BORDER_TYPE type); 28 | 29 | protected: 30 | //--- handlers of object settings 31 | virtual bool OnSetText(void) { return(m_rectangle.Description(m_text)); } 32 | virtual bool OnSetColorBackground(void) { return(m_rectangle.BackColor(m_color_background)); } 33 | virtual bool OnSetColorBorder(void) { return(m_rectangle.Color(m_color_border)); } 34 | //--- internal event handlers 35 | virtual bool OnCreate(void); 36 | virtual bool OnShow(void); 37 | virtual bool OnHide(void); 38 | virtual bool OnMove(void); 39 | virtual bool OnResize(void); 40 | virtual bool OnChange(void); 41 | }; 42 | //+------------------------------------------------------------------+ 43 | //| Constructor | 44 | //+------------------------------------------------------------------+ 45 | CPanel::CPanel(void) : m_border(BORDER_FLAT) 46 | { 47 | } 48 | //+------------------------------------------------------------------+ 49 | //| Destructor | 50 | //+------------------------------------------------------------------+ 51 | CPanel::~CPanel(void) 52 | { 53 | } 54 | //+------------------------------------------------------------------+ 55 | //| Create a control | 56 | //+------------------------------------------------------------------+ 57 | bool CPanel::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) 58 | { 59 | //--- call method of the parent class 60 | if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2)) 61 | return(false); 62 | //--- create the chart object 63 | if(!m_rectangle.Create(chart,name,subwin,x1,y1,Width(),Height())) 64 | return(false); 65 | //--- call the settings handler 66 | return(OnChange()); 67 | } 68 | //+------------------------------------------------------------------+ 69 | //| Set border type | 70 | //+------------------------------------------------------------------+ 71 | bool CPanel::BorderType(const ENUM_BORDER_TYPE type) 72 | { 73 | //--- save new value of parameter 74 | m_border=type; 75 | //--- set up the chart object 76 | return(m_rectangle.BorderType(type)); 77 | } 78 | //+------------------------------------------------------------------+ 79 | //| Create object on chart | 80 | //+------------------------------------------------------------------+ 81 | bool CPanel::OnCreate(void) 82 | { 83 | //--- create the chart object by previously set parameters 84 | return(m_rectangle.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height())); 85 | } 86 | //+------------------------------------------------------------------+ 87 | //| Display object on chart | 88 | //+------------------------------------------------------------------+ 89 | bool CPanel::OnShow(void) 90 | { 91 | return(m_rectangle.Timeframes(OBJ_ALL_PERIODS)); 92 | } 93 | //+------------------------------------------------------------------+ 94 | //| Hide object from chart | 95 | //+------------------------------------------------------------------+ 96 | bool CPanel::OnHide(void) 97 | { 98 | return(m_rectangle.Timeframes(OBJ_NO_PERIODS)); 99 | } 100 | //+------------------------------------------------------------------+ 101 | //| Absolute movement of the chart object | 102 | //+------------------------------------------------------------------+ 103 | bool CPanel::OnMove(void) 104 | { 105 | //--- position the chart object 106 | return(m_rectangle.X_Distance(m_rect.left) && m_rectangle.Y_Distance(m_rect.top)); 107 | } 108 | //+------------------------------------------------------------------+ 109 | //| Resize the chart object | 110 | //+------------------------------------------------------------------+ 111 | bool CPanel::OnResize(void) 112 | { 113 | //--- resize the chart object 114 | return(m_rectangle.X_Size(m_rect.Width()) && m_rectangle.Y_Size(m_rect.Height())); 115 | } 116 | //+------------------------------------------------------------------+ 117 | //| Set up the chart object | 118 | //+------------------------------------------------------------------+ 119 | bool CPanel::OnChange(void) 120 | { 121 | //--- set up the chart object 122 | return(CWndObj::OnChange() && m_rectangle.BorderType(m_border)); 123 | } 124 | //+------------------------------------------------------------------+ 125 | -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/Picture.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Picture.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #include "WndObj.mqh" 7 | #include 8 | //+------------------------------------------------------------------+ 9 | //| Class CPicture | 10 | //| Note: image displayed by | 11 | //| the CChartObjectBmpLabel object | 12 | //+------------------------------------------------------------------+ 13 | class CPicture : public CWndObj 14 | { 15 | private: 16 | CChartObjectBmpLabel m_picture; // chart object 17 | //--- parameters of the chart object 18 | int m_border; // border width 19 | string m_bmp_name; // filename 20 | 21 | public: 22 | CPicture(void); 23 | ~CPicture(void); 24 | //--- create 25 | virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); 26 | //--- parameters of the chart object 27 | int Border(void) const { return(m_border); } 28 | bool Border(const int value); 29 | string BmpName(void) const { return(m_bmp_name); } 30 | bool BmpName(const string name); 31 | 32 | protected: 33 | //--- internal event handlers 34 | virtual bool OnCreate(void); 35 | virtual bool OnShow(void); 36 | virtual bool OnHide(void); 37 | virtual bool OnMove(void); 38 | virtual bool OnChange(void); 39 | }; 40 | //+------------------------------------------------------------------+ 41 | //| Constructor | 42 | //+------------------------------------------------------------------+ 43 | CPicture::CPicture(void) : m_border(0), 44 | m_bmp_name(NULL) 45 | { 46 | } 47 | //+------------------------------------------------------------------+ 48 | //| Destructor | 49 | //+------------------------------------------------------------------+ 50 | CPicture::~CPicture(void) 51 | { 52 | } 53 | //+------------------------------------------------------------------+ 54 | //| Create a control | 55 | //+------------------------------------------------------------------+ 56 | bool CPicture::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) 57 | { 58 | //--- call method of the parent class 59 | if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2)) 60 | return(false); 61 | //--- create the chart object 62 | if(!m_picture.Create(chart,name,subwin,x1,y1)) 63 | return(false); 64 | //--- call the settings handler 65 | return(OnChange()); 66 | } 67 | //+------------------------------------------------------------------+ 68 | //| Set border width | 69 | //+------------------------------------------------------------------+ 70 | bool CPicture::Border(const int value) 71 | { 72 | //--- save new value of parameter 73 | m_border=value; 74 | //--- set up the chart object 75 | return(m_picture.Width(value)); 76 | } 77 | //+------------------------------------------------------------------+ 78 | //| Set image | 79 | //+------------------------------------------------------------------+ 80 | bool CPicture::BmpName(const string name) 81 | { 82 | //--- save new value of parameter 83 | m_bmp_name=name; 84 | //--- set up the chart object 85 | return(m_picture.BmpFileOn(name)); 86 | } 87 | //+------------------------------------------------------------------+ 88 | //| Create object on chart | 89 | //+------------------------------------------------------------------+ 90 | bool CPicture::OnCreate(void) 91 | { 92 | //--- create the chart object by previously set parameters 93 | return(m_picture.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top)); 94 | } 95 | //+------------------------------------------------------------------+ 96 | //| Display object on chart | 97 | //+------------------------------------------------------------------+ 98 | bool CPicture::OnShow(void) 99 | { 100 | return(m_picture.Timeframes(OBJ_ALL_PERIODS)); 101 | } 102 | //+------------------------------------------------------------------+ 103 | //| Hide object from chart | 104 | //+------------------------------------------------------------------+ 105 | bool CPicture::OnHide(void) 106 | { 107 | return(m_picture.Timeframes(OBJ_NO_PERIODS)); 108 | } 109 | //+------------------------------------------------------------------+ 110 | //| Absolute movement of the chart object | 111 | //+------------------------------------------------------------------+ 112 | bool CPicture::OnMove(void) 113 | { 114 | //--- position the chart object 115 | return(m_picture.X_Distance(m_rect.left) && m_picture.Y_Distance(m_rect.top)); 116 | } 117 | //+------------------------------------------------------------------+ 118 | //| Set up the chart object | 119 | //+------------------------------------------------------------------+ 120 | bool CPicture::OnChange(void) 121 | { 122 | //--- set up the chart object 123 | return(m_picture.Width(m_border) && m_picture.BmpFileOn(m_bmp_name)); 124 | } 125 | //+------------------------------------------------------------------+ 126 | -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/RadioButton.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| RadioButton.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql5.com | 5 | //+------------------------------------------------------------------+ 6 | #include "WndContainer.mqh" 7 | #include "BmpButton.mqh" 8 | #include "Edit.mqh" 9 | //+------------------------------------------------------------------+ 10 | //| Resources | 11 | //+------------------------------------------------------------------+ 12 | #resource "res\\RadioButtonOn.bmp" 13 | #resource "res\\RadioButtonOff.bmp" 14 | //+------------------------------------------------------------------+ 15 | //| Class CRadioButton | 16 | //| Usage: class that implements the "RadioButton" control | 17 | //+------------------------------------------------------------------+ 18 | class CRadioButton : public CWndContainer 19 | { 20 | private: 21 | //--- dependent controls 22 | CBmpButton m_button; // button object 23 | CEdit m_label; // label object 24 | 25 | public: 26 | CRadioButton(void); 27 | ~CRadioButton(void); 28 | //--- create 29 | virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2); 30 | //--- chart event handler 31 | virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam); 32 | //--- settings 33 | string Text(void) const { return(m_label.Text()); } 34 | bool Text(const string value) { return(m_label.Text(value)); } 35 | color Color(void) const { return(m_label.Color()); } 36 | bool Color(const color value) { return(m_label.Color(value)); } 37 | //--- state 38 | bool State(void) const { return(m_button.Pressed()); } 39 | bool State(const bool flag) { return(m_button.Pressed(flag)); } 40 | 41 | protected: 42 | //--- create dependent controls 43 | virtual bool CreateButton(void); 44 | virtual bool CreateLabel(void); 45 | //--- handlers of the dependent controls events 46 | virtual bool OnClickButton(void); 47 | virtual bool OnClickLabel(void); 48 | }; 49 | //+------------------------------------------------------------------+ 50 | //| Common handler of chart events | 51 | //+------------------------------------------------------------------+ 52 | EVENT_MAP_BEGIN(CRadioButton) 53 | ON_EVENT(ON_CLICK,m_button,OnClickButton) 54 | ON_EVENT(ON_CLICK,m_label,OnClickLabel) 55 | EVENT_MAP_END(CWndContainer) 56 | //+------------------------------------------------------------------+ 57 | //| Constructor | 58 | //+------------------------------------------------------------------+ 59 | CRadioButton::CRadioButton(void) 60 | { 61 | } 62 | //+------------------------------------------------------------------+ 63 | //| Destructor | 64 | //+------------------------------------------------------------------+ 65 | CRadioButton::~CRadioButton(void) 66 | { 67 | } 68 | //+------------------------------------------------------------------+ 69 | //| Create a control | 70 | //+------------------------------------------------------------------+ 71 | bool CRadioButton::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) 72 | { 73 | //--- call method of the parent class 74 | if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2)) 75 | return(false); 76 | //--- create dependent controls 77 | if(!CreateButton()) 78 | return(false); 79 | if(!CreateLabel()) 80 | return(false); 81 | //--- succeeded 82 | return(true); 83 | } 84 | //+------------------------------------------------------------------+ 85 | //| Create button | 86 | //+------------------------------------------------------------------+ 87 | bool CRadioButton::CreateButton(void) 88 | { 89 | //--- calculate coordinates 90 | int x1=CONTROLS_RADIO_BUTTON_X_OFF; 91 | int y1=CONTROLS_RADIO_BUTTON_Y_OFF; 92 | int x2=x1+CONTROLS_BUTTON_SIZE; 93 | int y2=y1+CONTROLS_BUTTON_SIZE-CONTROLS_BORDER_WIDTH; 94 | //--- create 95 | if(!m_button.Create(m_chart_id,m_name+"Button",m_subwin,x1,y1,x2,y2)) 96 | return(false); 97 | if(!m_button.BmpNames("::res\\RadioButtonOff.bmp","::res\\RadioButtonOn.bmp")) 98 | return(false); 99 | if(!Add(m_button)) 100 | return(false); 101 | m_button.Locking(true); 102 | //--- succeeded 103 | return(true); 104 | } 105 | //+------------------------------------------------------------------+ 106 | //| Create label | 107 | //+------------------------------------------------------------------+ 108 | bool CRadioButton::CreateLabel(void) 109 | { 110 | //--- calculate coordinates 111 | int x1=CONTROLS_RADIO_LABEL_X_OFF; 112 | int y1=CONTROLS_RADIO_LABEL_Y_OFF; 113 | int x2=Width(); 114 | int y2=Height(); 115 | //--- create 116 | if(!m_label.Create(m_chart_id,m_name+"Label",m_subwin,x1,y1,x2,y2)) 117 | return(false); 118 | if(!m_label.Text(m_name)) 119 | return(false); 120 | if(!Add(m_label)) 121 | return(false); 122 | m_label.ReadOnly(true); 123 | m_label.ColorBackground(CONTROLS_CHECKGROUP_COLOR_BG); 124 | m_label.ColorBorder(CONTROLS_CHECKGROUP_COLOR_BG); 125 | //--- succeeded 126 | return(true); 127 | } 128 | //+------------------------------------------------------------------+ 129 | //| Handler of click on button | 130 | //+------------------------------------------------------------------+ 131 | bool CRadioButton::OnClickButton(void) 132 | { 133 | //--- if button is in the "turned off" state, turn it on again and complete the handling 134 | //--- this is due to that radio button can not be turned off by clicking on it (it can be only turned on) 135 | if(!m_button.Pressed()) 136 | { 137 | //--- turn on the radio button 138 | if(!m_button.Pressed(true)) 139 | return(false); 140 | } 141 | //--- send the "changed state" event 142 | EventChartCustom(INTERNAL_EVENT,ON_CHANGE,m_id,0.0,m_name); 143 | //--- handled 144 | return(true); 145 | } 146 | //+------------------------------------------------------------------+ 147 | //| Handler of click on label | 148 | //+------------------------------------------------------------------+ 149 | bool CRadioButton::OnClickLabel(void) 150 | { 151 | //--- if button is in the "turned on" state, simply complete the handling 152 | //--- this is due to that radio button can not be turned off by clicking on it (it can be only turned on) 153 | if(m_button.Pressed()) 154 | return(true); 155 | //--- turn on the radio button 156 | m_button.Pressed(true); 157 | //--- return the result of the button click handler 158 | return(OnClickButton()); 159 | } 160 | //+------------------------------------------------------------------+ 161 | -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/RadioGroup.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/RadioGroup.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/Scrolls.mqh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/Scrolls.mqh -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/CheckBoxOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/CheckBoxOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/CheckBoxOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/CheckBoxOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Close.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Close.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/CloseDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/CloseDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/CloseOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/CloseOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/CloseOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/CloseOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DateDropOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DateDropOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DateDropOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DateDropOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Down.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Down.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DownDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DownDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DownSmall.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DownSmall.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DownTransp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DownTransp.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DropOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DropOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/DropOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/DropOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ExpandDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ExpandDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ExpandOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ExpandOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ExpandOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ExpandOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/HelpDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/HelpDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/HelpOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/HelpOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/HelpOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/HelpOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Left.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Left.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/LeftDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/LeftDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/LeftTransp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/LeftTransp.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RadioButtonOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RadioButtonOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RadioButtonOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RadioButtonOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Restore.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Restore.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RestoreDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RestoreDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RestoreOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RestoreOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RestoreOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RestoreOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Right.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Right.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RightDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RightDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/RightTransp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/RightTransp.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/SpinDec.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/SpinDec.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/SpinInc.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/SpinInc.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ThumbHor.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ThumbHor.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ThumbHorDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ThumbHorDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ThumbVert.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ThumbVert.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/ThumbVertDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/ThumbVertDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Turn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Turn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/TurnOff.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/TurnOff.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/TurnOn.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/TurnOn.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/Up.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/Up.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/UpDisable.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/UpDisable.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/UpSmall.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/UpSmall.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/UpTransp.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/UpTransp.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/down_smoll.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/down_smoll.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Controls/res/up_smoll.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Include/Controls/res/up_smoll.bmp -------------------------------------------------------------------------------- /files/MQL4/Include/Files/FileTxt.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| FileTxt.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | //+------------------------------------------------------------------+ 6 | #include "File.mqh" 7 | //+------------------------------------------------------------------+ 8 | //| Class CFileTxt | 9 | //| Purpose: Class of operations with text files. | 10 | //| Derives from class CFile. | 11 | //+------------------------------------------------------------------+ 12 | class CFileTxt : public CFile 13 | { 14 | public: 15 | CFileTxt(void); 16 | ~CFileTxt(void); 17 | //--- methods for working with files 18 | int Open(const string file_name,const int open_flags); 19 | //--- methods to access data 20 | uint WriteString(const string value); 21 | string ReadString(void); 22 | }; 23 | //+------------------------------------------------------------------+ 24 | //| Constructor | 25 | //+------------------------------------------------------------------+ 26 | CFileTxt::CFileTxt(void) 27 | { 28 | } 29 | //+------------------------------------------------------------------+ 30 | //| Destructor | 31 | //+------------------------------------------------------------------+ 32 | CFileTxt::~CFileTxt(void) 33 | { 34 | } 35 | //+------------------------------------------------------------------+ 36 | //| Open the text file | 37 | //+------------------------------------------------------------------+ 38 | int CFileTxt::Open(const string file_name,const int open_flags) 39 | { 40 | return(CFile::Open(file_name,open_flags|FILE_TXT)); 41 | } 42 | //+------------------------------------------------------------------+ 43 | //| Writing string to file | 44 | //+------------------------------------------------------------------+ 45 | uint CFileTxt::WriteString(const string value) 46 | { 47 | //--- check handle 48 | if(m_handle!=INVALID_HANDLE) 49 | return(FileWriteString(m_handle,value)); 50 | //--- failure 51 | return(0); 52 | } 53 | //+------------------------------------------------------------------+ 54 | //| Reading string from file | 55 | //+------------------------------------------------------------------+ 56 | string CFileTxt::ReadString(void) 57 | { 58 | //--- check handle 59 | if(m_handle!=INVALID_HANDLE) 60 | return(FileReadString(m_handle)); 61 | //--- failure 62 | return(""); 63 | } 64 | //+------------------------------------------------------------------+ 65 | -------------------------------------------------------------------------------- /files/MQL4/Include/Indicators/Custom.mqh: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| Custom.mqh | 3 | //| Copyright 2009-2013, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | //+------------------------------------------------------------------+ 6 | #include "Indicator.mqh" 7 | //+------------------------------------------------------------------+ 8 | //| Class CiCustom. | 9 | //| Purpose: Class of custom indicators. | 10 | //| Derives from class CIndicator. | 11 | //+------------------------------------------------------------------+ 12 | class CiCustom : public CIndicator 13 | { 14 | protected: 15 | int m_num_params; // number of creation parameters 16 | MqlParam m_params[]; // creation parameters 17 | 18 | public: 19 | CiCustom(void); 20 | ~CiCustom(void); 21 | //--- methods of access to protected data 22 | bool NumBuffers(const int buffers); 23 | int NumParams(void) const { return(m_num_params); } 24 | ENUM_DATATYPE ParamType(const int ind) const; 25 | long ParamLong(const int ind) const; 26 | double ParamDouble(const int ind) const; 27 | string ParamString(const int ind) const; 28 | //--- methods of access to indicator data 29 | virtual double GetData(const int buffer_num,const int index) const; 30 | //--- method of identifying 31 | virtual int Type(void) const { return(IND_CUSTOM); } 32 | 33 | protected: 34 | //--- methods of tuning 35 | virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]); 36 | }; 37 | //+------------------------------------------------------------------+ 38 | //| Constructor | 39 | //+------------------------------------------------------------------+ 40 | CiCustom::CiCustom(void) : m_num_params(0) 41 | { 42 | } 43 | //+------------------------------------------------------------------+ 44 | //| Destructor | 45 | //+------------------------------------------------------------------+ 46 | CiCustom::~CiCustom(void) 47 | { 48 | } 49 | //+------------------------------------------------------------------+ 50 | //| Set number of buffers of indicator | 51 | //+------------------------------------------------------------------+ 52 | bool CiCustom::NumBuffers(const int buffers) 53 | { 54 | return(true); 55 | } 56 | //+------------------------------------------------------------------+ 57 | //| Get type of specified parameter of creation | 58 | //+------------------------------------------------------------------+ 59 | ENUM_DATATYPE CiCustom::ParamType(const int ind) const 60 | { 61 | if(ind>=m_num_params) 62 | // return(WRONG_VALUE); 63 | return(-1); 64 | //--- 65 | return(m_params[ind].type); 66 | } 67 | //+------------------------------------------------------------------+ 68 | //| Get specified parameter of creatiob as a long value | 69 | //+------------------------------------------------------------------+ 70 | long CiCustom::ParamLong(const int ind) const 71 | { 72 | if(ind>=m_num_params) 73 | return(0); 74 | switch(m_params[ind].type) 75 | { 76 | case TYPE_DOUBLE: 77 | case TYPE_FLOAT: 78 | case TYPE_STRING: 79 | return(0); 80 | } 81 | //--- 82 | return(m_params[ind].integer_value); 83 | } 84 | //+------------------------------------------------------------------+ 85 | //| Get specified parameter of creation as a double value | 86 | //+------------------------------------------------------------------+ 87 | double CiCustom::ParamDouble(const int ind) const 88 | { 89 | if(ind>=m_num_params) 90 | return(EMPTY_VALUE); 91 | switch(m_params[ind].type) 92 | { 93 | case TYPE_DOUBLE: 94 | case TYPE_FLOAT: 95 | break; 96 | default: 97 | return(EMPTY_VALUE); 98 | } 99 | //--- 100 | return(m_params[ind].double_value); 101 | } 102 | //+------------------------------------------------------------------+ 103 | //| Get specified parameter of creation as a string value | 104 | //+------------------------------------------------------------------+ 105 | string CiCustom::ParamString(const int ind) const 106 | { 107 | if(ind>=m_num_params || m_params[ind].type!=TYPE_STRING) 108 | return(""); 109 | //--- 110 | return(m_params[ind].string_value); 111 | } 112 | //+------------------------------------------------------------------+ 113 | //| Initialize the indicator with universal parameters | 114 | //+------------------------------------------------------------------+ 115 | bool CiCustom::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam ¶ms[]) 116 | { 117 | //--- string of status of drawing 118 | m_name ="Custom "+params[0].string_value; 119 | //--- save settings 120 | ArrayResize(m_params,num_params); 121 | for(int i=0;i 7 | //+------------------------------------------------------------------+ 8 | //| Class CSeries. | 9 | //| Purpose: Base class for access to timeseries. | 10 | //| Derives from class CObject. | 11 | //+------------------------------------------------------------------+ 12 | class CSeries : public CObject 13 | { 14 | protected: 15 | string m_name; // name of series 16 | int m_buffers_total; // number of buffers 17 | int m_timeframe_flags; // flags of timeframes (similar to "flags of visibility of objects") 18 | string m_symbol; // symbol 19 | int m_period; // period 20 | 21 | public: 22 | CSeries(void); 23 | ~CSeries(void); 24 | //--- methods of access to protected data 25 | string Name(void) const { return(m_name); } 26 | int BuffersTotal(void) const { return(m_buffers_total); } 27 | int Timeframe(void) const { return(m_timeframe_flags); } 28 | string Symbol(void) const { return(m_symbol); } 29 | int Period(void) const { return(m_period); } 30 | string PeriodDescription(const int val=0); 31 | //--- method of tuning 32 | virtual bool BufferResize(const int size) { return(true); } 33 | //--- method of refreshing" of the data 34 | virtual void Refresh(const int flags=OBJ_ALL_PERIODS) { } 35 | 36 | protected: 37 | //--- methods of tuning 38 | void SetSymbolPeriod(const string symbol,const int period); 39 | void PeriodToTimeframeFlag(const ENUM_TIMEFRAMES period); 40 | }; 41 | //+------------------------------------------------------------------+ 42 | //| Constructor | 43 | //+------------------------------------------------------------------+ 44 | void CSeries::CSeries(void) : m_name(""), 45 | m_timeframe_flags(0), 46 | m_buffers_total(0), 47 | m_symbol(""), 48 | m_period(-1) 49 | { 50 | } 51 | //+------------------------------------------------------------------+ 52 | //| Destructor | 53 | //+------------------------------------------------------------------+ 54 | CSeries::~CSeries(void) 55 | { 56 | } 57 | //+------------------------------------------------------------------+ 58 | //| Set symbol and period | 59 | //+------------------------------------------------------------------+ 60 | void CSeries::SetSymbolPeriod(const string symbol,const int period) 61 | { 62 | m_symbol=(symbol==NULL) ? Symbol() : symbol; 63 | m_period=(period==0) ? Period() : period; 64 | PeriodToTimeframeFlag((ENUM_TIMEFRAMES)m_period); 65 | } 66 | //+------------------------------------------------------------------+ 67 | //| Convert period to timeframe flag (similar to visibility flags) | 68 | //+------------------------------------------------------------------+ 69 | void CSeries::PeriodToTimeframeFlag(const ENUM_TIMEFRAMES period) 70 | { 71 | static ENUM_TIMEFRAMES _p_int[]= 72 | { 73 | PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30, 74 | PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1 75 | }; 76 | //--- cycle for all timeframes 77 | for(int i=0;i 12 | 13 | //--- indicator settings 14 | #property indicator_separate_window 15 | #property indicator_buffers 3 16 | #property indicator_color1 Black 17 | #property indicator_color2 Green 18 | #property indicator_color3 Red 19 | //--- indicator buffers 20 | double ExtACBuffer[]; 21 | double ExtUpBuffer[]; 22 | double ExtDnBuffer[]; 23 | double ExtMacdBuffer[]; 24 | double ExtSignalBuffer[]; 25 | //--- 26 | #define PERIOD_FAST 5 27 | #define PERIOD_SLOW 34 28 | //--- bars minimum for calculation 29 | #define DATA_LIMIT 38 30 | //+------------------------------------------------------------------+ 31 | //| Custom indicator initialization function | 32 | //+------------------------------------------------------------------+ 33 | void OnInit(void) 34 | { 35 | IndicatorShortName("AC"); 36 | //--- 2 additional buffers are used for counting. 37 | IndicatorBuffers(5); 38 | //--- drawing settings 39 | SetIndexStyle(0,DRAW_NONE); 40 | SetIndexStyle(1,DRAW_HISTOGRAM); 41 | SetIndexStyle(2,DRAW_HISTOGRAM); 42 | IndicatorDigits(Digits+2); 43 | SetIndexDrawBegin(0,DATA_LIMIT); 44 | SetIndexDrawBegin(1,DATA_LIMIT); 45 | SetIndexDrawBegin(2,DATA_LIMIT); 46 | //--- all indicator buffers mapping 47 | SetIndexBuffer(0,ExtACBuffer); 48 | SetIndexBuffer(1,ExtUpBuffer); 49 | SetIndexBuffer(2,ExtDnBuffer); 50 | SetIndexBuffer(3,ExtMacdBuffer); 51 | SetIndexBuffer(4,ExtSignalBuffer); 52 | //--- name for DataWindow and indicator subwindow label 53 | SetIndexLabel(1,NULL); 54 | SetIndexLabel(2,NULL); 55 | } 56 | //+------------------------------------------------------------------+ 57 | //| Accelerator/Decelerator Oscillator | 58 | //+------------------------------------------------------------------+ 59 | int OnCalculate (const int rates_total, 60 | const int prev_calculated, 61 | const datetime& time[], 62 | const double& open[], 63 | const double& high[], 64 | const double& low[], 65 | const double& close[], 66 | const long& tick_volume[], 67 | const long& volume[], 68 | const int& spread[]) 69 | { 70 | int i,limit; 71 | double prev=0.0,current; 72 | //--- check for rates total 73 | if(rates_total<=DATA_LIMIT) 74 | return(0); 75 | //--- last counted bar will be recounted 76 | limit=rates_total-prev_calculated; 77 | if(prev_calculated>0) 78 | { 79 | limit++; 80 | prev=ExtMacdBuffer[limit]-ExtSignalBuffer[limit]; 81 | } 82 | //--- macd counted in the 1-st additional buffer 83 | for(i=0; i=0;) 91 | { 92 | current=ExtMacdBuffer[i]-ExtSignalBuffer[i]; 93 | if(current>prev) 94 | up=true; 95 | if(current=0) 49 | { 50 | ExtADbuffer[i]=(close[i]-low[i])-(high[i]-close[i]); 51 | if(ExtADbuffer[i]!=0.0) 52 | { 53 | double diff=high[i]-low[i]; 54 | if(diff<0.000000001) 55 | ExtADbuffer[i]=0.0; 56 | else 57 | { 58 | ExtADbuffer[i]/=diff; 59 | ExtADbuffer[i]*=(double)tick_volume[i]; 60 | } 61 | } 62 | if(i0) 69 | { 70 | limit++; 71 | prev=ExtAOBuffer[limit]; 72 | } 73 | //--- macd 74 | for(i=0; i=0; i--) 80 | { 81 | current=ExtAOBuffer[i]; 82 | if(current>prev) 83 | up=true; 84 | if(current 12 | 13 | #property indicator_chart_window 14 | #property indicator_buffers 3 15 | #property indicator_color1 LightSeaGreen 16 | #property indicator_color2 LightSeaGreen 17 | #property indicator_color3 LightSeaGreen 18 | //--- indicator parameters 19 | input int InpBandsPeriod=20; // Bands Period 20 | input int InpBandsShift=0; // Bands Shift 21 | input double InpBandsDeviations=2.0; // Bands Deviations 22 | //--- buffers 23 | double ExtMovingBuffer[]; 24 | double ExtUpperBuffer[]; 25 | double ExtLowerBuffer[]; 26 | double ExtStdDevBuffer[]; 27 | //+------------------------------------------------------------------+ 28 | //| Custom indicator initialization function | 29 | //+------------------------------------------------------------------+ 30 | int OnInit(void) 31 | { 32 | //--- 1 additional buffer used for counting. 33 | IndicatorBuffers(4); 34 | IndicatorDigits(Digits); 35 | //--- middle line 36 | SetIndexStyle(0,DRAW_LINE); 37 | SetIndexBuffer(0,ExtMovingBuffer); 38 | SetIndexShift(0,InpBandsShift); 39 | SetIndexLabel(0,"Bands SMA"); 40 | //--- upper band 41 | SetIndexStyle(1,DRAW_LINE); 42 | SetIndexBuffer(1,ExtUpperBuffer); 43 | SetIndexShift(1,InpBandsShift); 44 | SetIndexLabel(1,"Bands Upper"); 45 | //--- lower band 46 | SetIndexStyle(2,DRAW_LINE); 47 | SetIndexBuffer(2,ExtLowerBuffer); 48 | SetIndexShift(2,InpBandsShift); 49 | SetIndexLabel(2,"Bands Lower"); 50 | //--- work buffer 51 | SetIndexBuffer(3,ExtStdDevBuffer); 52 | //--- check for input parameter 53 | if(InpBandsPeriod<=0) 54 | { 55 | Print("Wrong input parameter Bands Period=",InpBandsPeriod); 56 | return(INIT_FAILED); 57 | } 58 | //--- 59 | SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift); 60 | SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift); 61 | SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift); 62 | //--- initialization done 63 | return(INIT_SUCCEEDED); 64 | } 65 | //+------------------------------------------------------------------+ 66 | //| Bollinger Bands | 67 | //+------------------------------------------------------------------+ 68 | int OnCalculate(const int rates_total, 69 | const int prev_calculated, 70 | const datetime &time[], 71 | const double &open[], 72 | const double &high[], 73 | const double &low[], 74 | const double &close[], 75 | const long &tick_volume[], 76 | const long &volume[], 77 | const int &spread[]) 78 | { 79 | int i,pos; 80 | //--- 81 | if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0) 82 | return(0); 83 | //--- counting from 0 to rates_total 84 | ArraySetAsSeries(ExtMovingBuffer,false); 85 | ArraySetAsSeries(ExtUpperBuffer,false); 86 | ArraySetAsSeries(ExtLowerBuffer,false); 87 | ArraySetAsSeries(ExtStdDevBuffer,false); 88 | ArraySetAsSeries(close,false); 89 | //--- initial zero 90 | if(prev_calculated<1) 91 | { 92 | for(i=0; i1) 101 | pos=prev_calculated-1; 102 | else 103 | pos=0; 104 | //--- main cycle 105 | for(i=pos; i=period) 129 | { 130 | //--- calcualte StdDev 131 | for(int i=0; i0) 58 | limit++; 59 | for(int i=0; i0) 58 | limit++; 59 | for(int i=0; i 12 | 13 | #property indicator_separate_window 14 | #property indicator_buffers 1 15 | #property indicator_color1 LightSeaGreen 16 | #property indicator_level1 -100.0 17 | #property indicator_level2 100.0 18 | #property indicator_levelcolor clrSilver 19 | #property indicator_levelstyle STYLE_DOT 20 | //--- input parameter 21 | input int InpCCIPeriod=14; // CCI Period 22 | //--- buffers 23 | double ExtCCIBuffer[]; 24 | double ExtPriceBuffer[]; 25 | double ExtMovBuffer[]; 26 | //+------------------------------------------------------------------+ 27 | //| Custom indicator initialization function | 28 | //+------------------------------------------------------------------+ 29 | int OnInit(void) 30 | { 31 | string short_name; 32 | //--- 2 additional buffers are used for counting. 33 | IndicatorBuffers(3); 34 | SetIndexBuffer(1,ExtPriceBuffer); 35 | SetIndexBuffer(2,ExtMovBuffer); 36 | //--- indicator line 37 | SetIndexStyle(0,DRAW_LINE); 38 | SetIndexBuffer(0,ExtCCIBuffer); 39 | //--- check for input parameter 40 | if(InpCCIPeriod<=1) 41 | { 42 | Print("Wrong input parameter CCI Period=",InpCCIPeriod); 43 | return(INIT_FAILED); 44 | } 45 | //--- 46 | SetIndexDrawBegin(0,InpCCIPeriod); 47 | //--- name for DataWindow and indicator subwindow label 48 | short_name="CCI("+IntegerToString(InpCCIPeriod)+")"; 49 | IndicatorShortName(short_name); 50 | SetIndexLabel(0,short_name); 51 | //--- initialization done 52 | return(INIT_SUCCEEDED); 53 | } 54 | //+------------------------------------------------------------------+ 55 | //| Commodity Channel Index | 56 | //+------------------------------------------------------------------+ 57 | int OnCalculate(const int rates_total, 58 | const int prev_calculated, 59 | const datetime &time[], 60 | const double &open[], 61 | const double &high[], 62 | const double &low[], 63 | const double &close[], 64 | const long &tick_volume[], 65 | const long &volume[], 66 | const int &spread[]) 67 | { 68 | int i,k,pos; 69 | double dSum,dMul; 70 | //--- 71 | if(rates_total<=InpCCIPeriod || InpCCIPeriod<=1) 72 | return(0); 73 | //--- counting from 0 to rates_total 74 | ArraySetAsSeries(ExtCCIBuffer,false); 75 | ArraySetAsSeries(ExtPriceBuffer,false); 76 | ArraySetAsSeries(ExtMovBuffer,false); 77 | ArraySetAsSeries(high,false); 78 | ArraySetAsSeries(low,false); 79 | ArraySetAsSeries(close,false); 80 | //--- initial zero 81 | if(prev_calculated<1) 82 | { 83 | for(i=0; i'Properties...'):" 9 | #property description " - on 'Color' Tab select 'Black' for 'Line Graph'" 10 | #property description " - on 'Common' Tab disable 'Chart on Foreground' checkbox and select 'Line Chart' radiobutton" 11 | #property strict 12 | 13 | #property indicator_chart_window 14 | #property indicator_buffers 4 15 | #property indicator_color1 Red 16 | #property indicator_color2 White 17 | #property indicator_color3 Red 18 | #property indicator_color4 White 19 | #property indicator_width1 1 20 | #property indicator_width2 1 21 | #property indicator_width3 3 22 | #property indicator_width4 3 23 | 24 | //--- 25 | input color ExtColor1 = Red; // Shadow of bear candlestick 26 | input color ExtColor2 = White; // Shadow of bull candlestick 27 | input color ExtColor3 = Red; // Bear candlestick body 28 | input color ExtColor4 = White; // Bull candlestick body 29 | //--- buffers 30 | double ExtLowHighBuffer[]; 31 | double ExtHighLowBuffer[]; 32 | double ExtOpenBuffer[]; 33 | double ExtCloseBuffer[]; 34 | //+------------------------------------------------------------------+ 35 | //| Custom indicator initialization function | 36 | //|------------------------------------------------------------------| 37 | void OnInit(void) 38 | { 39 | IndicatorShortName("Heiken Ashi"); 40 | IndicatorDigits(Digits); 41 | //--- indicator lines 42 | SetIndexStyle(0,DRAW_HISTOGRAM,0,1,ExtColor1); 43 | SetIndexBuffer(0,ExtLowHighBuffer); 44 | SetIndexStyle(1,DRAW_HISTOGRAM,0,1,ExtColor2); 45 | SetIndexBuffer(1,ExtHighLowBuffer); 46 | SetIndexStyle(2,DRAW_HISTOGRAM,0,3,ExtColor3); 47 | SetIndexBuffer(2,ExtOpenBuffer); 48 | SetIndexStyle(3,DRAW_HISTOGRAM,0,3,ExtColor4); 49 | SetIndexBuffer(3,ExtCloseBuffer); 50 | //--- 51 | SetIndexLabel(0,"Low/High"); 52 | SetIndexLabel(1,"High/Low"); 53 | SetIndexLabel(2,"Open"); 54 | SetIndexLabel(3,"Close"); 55 | SetIndexDrawBegin(0,10); 56 | SetIndexDrawBegin(1,10); 57 | SetIndexDrawBegin(2,10); 58 | SetIndexDrawBegin(3,10); 59 | //--- indicator buffers mapping 60 | SetIndexBuffer(0,ExtLowHighBuffer); 61 | SetIndexBuffer(1,ExtHighLowBuffer); 62 | SetIndexBuffer(2,ExtOpenBuffer); 63 | SetIndexBuffer(3,ExtCloseBuffer); 64 | //--- initialization done 65 | } 66 | //+------------------------------------------------------------------+ 67 | //| Heiken Ashi | 68 | //+------------------------------------------------------------------+ 69 | int OnCalculate(const int rates_total, 70 | const int prev_calculated, 71 | const datetime &time[], 72 | const double &open[], 73 | const double &high[], 74 | const double &low[], 75 | const double &close[], 76 | const long &tick_volume[], 77 | const long &volume[], 78 | const int &spread[]) 79 | { 80 | int i,pos; 81 | double haOpen,haHigh,haLow,haClose; 82 | //--- 83 | if(rates_total<=10) 84 | return(0); 85 | //--- counting from 0 to rates_total 86 | ArraySetAsSeries(ExtLowHighBuffer,false); 87 | ArraySetAsSeries(ExtHighLowBuffer,false); 88 | ArraySetAsSeries(ExtOpenBuffer,false); 89 | ArraySetAsSeries(ExtCloseBuffer,false); 90 | ArraySetAsSeries(open,false); 91 | ArraySetAsSeries(high,false); 92 | ArraySetAsSeries(low,false); 93 | ArraySetAsSeries(close,false); 94 | //--- preliminary calculation 95 | if(prev_calculated>1) 96 | pos=prev_calculated-1; 97 | else 98 | { 99 | //--- set first candle 100 | if(open[0]InpTenkan) 135 | pos=prev_calculated-1; 136 | for(i=pos; ilow[k]) 146 | low_value=low[k]; 147 | k++; 148 | } 149 | ExtTenkanBuffer[i]=(high_value+low_value)/2; 150 | } 151 | //--- Kijun Sen 152 | pos=InpKijun-1; 153 | if(prev_calculated>InpKijun) 154 | pos=prev_calculated-1; 155 | for(i=pos; ilow[k]) 165 | low_value=low[k]; 166 | k++; 167 | } 168 | ExtKijunBuffer[i]=(high_value+low_value)/2; 169 | } 170 | //--- Senkou Span A 171 | pos=ExtBegin-1; 172 | if(prev_calculated>ExtBegin) 173 | pos=prev_calculated-1; 174 | for(i=pos; iInpSenkou) 182 | pos=prev_calculated-1; 183 | for(i=pos; ilow[k]) 193 | low_value=low[k]; 194 | k++; 195 | } 196 | ExtSpanB_Buffer[i]=(high_value+low_value)/2; 197 | ExtSpanB2_Buffer[i]=ExtSpanB_Buffer[i]; 198 | } 199 | //--- Chikou Span 200 | pos=0; 201 | if(prev_calculated>1) 202 | pos=prev_calculated-1; 203 | for(i=pos; i 12 | 13 | //--- indicator settings 14 | #property indicator_separate_window 15 | #property indicator_buffers 2 16 | #property indicator_color1 Silver 17 | #property indicator_color2 Red 18 | #property indicator_width1 2 19 | //--- indicator parameters 20 | input int InpFastEMA=12; // Fast EMA Period 21 | input int InpSlowEMA=26; // Slow EMA Period 22 | input int InpSignalSMA=9; // Signal SMA Period 23 | //--- indicator buffers 24 | double ExtMacdBuffer[]; 25 | double ExtSignalBuffer[]; 26 | //--- right input parameters flag 27 | bool ExtParameters=false; 28 | 29 | //+------------------------------------------------------------------+ 30 | //| Custom indicator initialization function | 31 | //+------------------------------------------------------------------+ 32 | int OnInit(void) 33 | { 34 | IndicatorDigits(Digits+1); 35 | //--- drawing settings 36 | SetIndexStyle(0,DRAW_HISTOGRAM); 37 | SetIndexStyle(1,DRAW_LINE); 38 | SetIndexDrawBegin(1,InpSignalSMA); 39 | //--- indicator buffers mapping 40 | SetIndexBuffer(0,ExtMacdBuffer); 41 | SetIndexBuffer(1,ExtSignalBuffer); 42 | //--- name for DataWindow and indicator subwindow label 43 | IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")"); 44 | SetIndexLabel(0,"MACD"); 45 | SetIndexLabel(1,"Signal"); 46 | //--- check for input parameters 47 | if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA) 48 | { 49 | Print("Wrong input parameters"); 50 | ExtParameters=false; 51 | return(INIT_FAILED); 52 | } 53 | else 54 | ExtParameters=true; 55 | //--- initialization done 56 | return(INIT_SUCCEEDED); 57 | } 58 | //+------------------------------------------------------------------+ 59 | //| Moving Averages Convergence/Divergence | 60 | //+------------------------------------------------------------------+ 61 | int OnCalculate (const int rates_total, 62 | const int prev_calculated, 63 | const datetime& time[], 64 | const double& open[], 65 | const double& high[], 66 | const double& low[], 67 | const double& close[], 68 | const long& tick_volume[], 69 | const long& volume[], 70 | const int& spread[]) 71 | { 72 | int i,limit; 73 | //--- 74 | if(rates_total<=InpSignalSMA || !ExtParameters) 75 | return(0); 76 | //--- last counted bar will be recounted 77 | limit=rates_total-prev_calculated; 78 | if(prev_calculated>0) 79 | limit++; 80 | //--- macd counted in the 1-st buffer 81 | for(i=0; i 12 | 13 | //--- indicator settings 14 | #property indicator_separate_window 15 | #property indicator_buffers 1 16 | #property indicator_color1 Silver 17 | #property indicator_width1 2 18 | //--- indicator parameters 19 | input int InpFastEMA=12; // Fast EMA Period 20 | input int InpSlowEMA=26; // Slow EMA Period 21 | input int InpSignalSMA=9; // Signal SMA Period 22 | //--- indicator buffers 23 | double ExtOsmaBuffer[]; 24 | double ExtMacdBuffer[]; 25 | double ExtSignalBuffer[]; 26 | //--- right input parameters flag 27 | bool ExtParameters=false; 28 | //+------------------------------------------------------------------+ 29 | //| Custom indicator initialization function | 30 | //+------------------------------------------------------------------+ 31 | int OnInit(void) 32 | { 33 | //--- 2 additional buffers are used for counting. 34 | IndicatorBuffers(3); 35 | //--- drawing settings 36 | SetIndexStyle(0,DRAW_HISTOGRAM); 37 | SetIndexDrawBegin(0,InpSignalSMA); 38 | IndicatorDigits(Digits+2); 39 | //--- 3 indicator buffers mapping 40 | SetIndexBuffer(0,ExtOsmaBuffer); 41 | SetIndexBuffer(1,ExtMacdBuffer); 42 | SetIndexBuffer(2,ExtSignalBuffer); 43 | //--- name for DataWindow and indicator subwindow label 44 | IndicatorShortName("OsMA("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")"); 45 | //--- check for input parameters 46 | if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA) 47 | { 48 | Print("Wrong input parameters"); 49 | ExtParameters=false; 50 | return(INIT_FAILED); 51 | } 52 | else 53 | ExtParameters=true; 54 | //--- initialization done 55 | return(INIT_SUCCEEDED); 56 | } 57 | //+------------------------------------------------------------------+ 58 | //| Moving Average of Oscillator | 59 | //+------------------------------------------------------------------+ 60 | int OnCalculate (const int rates_total, 61 | const int prev_calculated, 62 | const datetime& time[], 63 | const double& open[], 64 | const double& high[], 65 | const double& low[], 66 | const double& close[], 67 | const long& tick_volume[], 68 | const long& volume[], 69 | const int& spread[]) 70 | { 71 | int i,limit; 72 | //--- 73 | if(rates_total<=InpSignalSMA || !ExtParameters) 74 | return(0); 75 | //--- last counted bar will be recounted 76 | limit=rates_total-prev_calculated; 77 | if(prev_calculated>0) 78 | limit++; 79 | //--- macd counted in the 1-st buffer 80 | for(i=0; ilow[k]) 107 | dmin=low[k]; 108 | if(dmax 13 | 14 | CFilePipe ExtPipe; 15 | //+------------------------------------------------------------------+ 16 | //| Script program start function | 17 | //+------------------------------------------------------------------+ 18 | void OnStart() 19 | { 20 | //--- wait for pipe server 21 | bool bfirst=true; 22 | while(!IsStopped()) 23 | { 24 | if(ExtPipe.Open("\\\\.\\pipe\\MQL5.Pipe.Server",FILE_READ|FILE_WRITE|FILE_BIN)!=INVALID_HANDLE) 25 | break; 26 | if(bfirst) 27 | { 28 | bfirst=false; 29 | Print("Client: waiting for pipe server"); 30 | } 31 | Sleep(250); 32 | } 33 | if(IsStopped()) 34 | return; 35 | Print("Client: pipe opened"); 36 | //--- send welcome message 37 | if(!ExtPipe.WriteString(__FILE__+" on MQL4 build "+IntegerToString(__MQL4BUILD__))) 38 | { 39 | Print("Client: sending welcome message failed"); 40 | return; 41 | } 42 | //--- read data from server 43 | string str; 44 | int value=0; 45 | 46 | if(!ExtPipe.ReadString(str)) 47 | { 48 | Print("Client: reading string failed"); 49 | return; 50 | } 51 | Print("Server: \"",str,"\" received"); 52 | 53 | if(!ExtPipe.ReadInteger(value)) 54 | { 55 | Print("Client: reading integer failed"); 56 | return; 57 | } 58 | Print("Server: ",value," received"); 59 | //--- send data to server 60 | if(!ExtPipe.WriteString("Test string")) 61 | { 62 | Print("Client: sending string failed"); 63 | return; 64 | } 65 | 66 | if(!ExtPipe.WriteInteger(value)) 67 | { 68 | Print("Client: sending integer failed"); 69 | return; 70 | } 71 | //--- benchmark 72 | double buffer[]; 73 | double volume=0.0; 74 | 75 | if(ArrayResize(buffer,1024*1024,0)==1024*1024) 76 | { 77 | uint ticks=GetTickCount(); 78 | //--- read 8 Mb * 128 = 1024 Mb from server 79 | for(int i=0; i<128 && !IsStopped(); i++) 80 | { 81 | uint items=ExtPipe.ReadArray(buffer); 82 | if(items!=1024*1024) 83 | { 84 | Print("Client: benchmark failed after ",volume/1024," Kb, ",items," items received"); 85 | break; 86 | } 87 | //--- check the guard data 88 | if(buffer[0]!=i || buffer[1024*1024-1]!=i+1024*1024-1) 89 | { 90 | Print("Client: benchmark invalid content"); 91 | break; 92 | } 93 | //--- 94 | volume+=sizeof(double)*1024*1024; 95 | } 96 | if(IsStopped()) 97 | return; 98 | //--- send confirmation 99 | value=12345; 100 | if(!ExtPipe.WriteInteger(value)) 101 | Print("Client: benchmark confirmation failed "); 102 | //--- show statistics 103 | ticks=GetTickCount()-ticks; 104 | if(ticks>0) 105 | printf("Client: %.0f Mb received at %.0f Mb per second\n",volume/1024/1024,volume/1024/ticks); 106 | //--- 107 | ArrayFree(buffer); 108 | } 109 | //--- 110 | ExtPipe.Close(); 111 | } 112 | //+------------------------------------------------------------------+ 113 | -------------------------------------------------------------------------------- /files/MQL4/Scripts/Examples/Pipes/PipeClientPure.ex4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Scripts/Examples/Pipes/PipeClientPure.ex4 -------------------------------------------------------------------------------- /files/MQL4/Scripts/Examples/Pipes/PipeClientPure.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| PipeClientPure.mq4 | 3 | //| Copyright 2012-2014, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | //+------------------------------------------------------------------+ 6 | #property copyright "Copyright 2012-2014, MetaQuotes Software Corp." 7 | #property link "http://www.mql4.com" 8 | #property version "1.00" 9 | #property description "Pipe client sample using pure file functions" 10 | #property strict 11 | 12 | int ExtPipe=-1; 13 | //+------------------------------------------------------------------+ 14 | //| | 15 | //+------------------------------------------------------------------+ 16 | void OnStart() 17 | { 18 | string str_client="PipeClient on MQL4 build "+IntegerToString(__MQL4BUILD__); 19 | uint size_str=StringLen(str_client); 20 | //--- wait for pipe server 21 | bool bfirst=true; 22 | while(!IsStopped()) 23 | { 24 | ExtPipe=FileOpen("\\\\.\\pipe\\MQL5.Pipe.Server",FILE_READ|FILE_WRITE|FILE_BIN|FILE_ANSI); 25 | if(ExtPipe>=0) 26 | break; 27 | if(bfirst) 28 | { 29 | bfirst=false; 30 | Print("Client: waiting for pipe server"); 31 | } 32 | Sleep(250); 33 | } 34 | if(IsStopped()) 35 | return; 36 | Print("Client: pipe opened"); 37 | //--- send welcome message 38 | FileWriteInteger(ExtPipe,size_str); 39 | if(FileWriteString(ExtPipe,str_client,size_str)0) 126 | { 127 | volume/=1024; 128 | Print("Client: ",DoubleToStr(volume/1024,0)," Mb sent in ",ticks," milliseconds at ",DoubleToStr(volume/ticks,2)," Mb per second"); 129 | } 130 | } 131 | //--- close pipe 132 | FileClose(ExtPipe); 133 | //--- 134 | } 135 | //+------------------------------------------------------------------+ 136 | //| | 137 | //+------------------------------------------------------------------+ 138 | bool WaitForRead(int handle,uint size) 139 | { 140 | //--- 141 | while(!IsStopped()) 142 | { 143 | if(FileSize(handle)>=size) 144 | return(true); 145 | Sleep(1); 146 | } 147 | //--- 148 | return(false); 149 | } 150 | //+------------------------------------------------------------------+ 151 | -------------------------------------------------------------------------------- /files/MQL4/Scripts/PeriodConverter.ex4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Scripts/PeriodConverter.ex4 -------------------------------------------------------------------------------- /files/MQL4/Scripts/PeriodConverter.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| PeriodConverter.mq4 | 3 | //| Copyright 2006-2015, MetaQuotes Software Corp. | 4 | //| http://www.metaquotes.net | 5 | //+------------------------------------------------------------------+ 6 | #property copyright "2006-2015, MetaQuotes Software Corp." 7 | #property link "http://www.mql4.com" 8 | #property description "Period Converter to updated format of history base" 9 | #property strict 10 | #property show_inputs 11 | 12 | input int InpPeriodMultiplier=3; // Period multiplier factor 13 | int ExtHandle=-1; 14 | //+------------------------------------------------------------------+ 15 | //| script program start function | 16 | //+------------------------------------------------------------------+ 17 | void OnStart() 18 | { 19 | datetime time0; 20 | ulong last_fpos=0; 21 | long last_volume=0; 22 | int i,start_pos,periodseconds; 23 | int cnt=0; 24 | //---- History header 25 | int file_version=401; 26 | string c_copyright; 27 | string c_symbol=Symbol(); 28 | int i_period=Period()*InpPeriodMultiplier; 29 | int i_digits=Digits; 30 | int i_unused[13]; 31 | MqlRates rate; 32 | //--- 33 | ExtHandle=FileOpenHistory(c_symbol+(string)i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI); 34 | if(ExtHandle<0) 35 | return; 36 | c_copyright="(C)opyright 2003, MetaQuotes Software Corp."; 37 | ArrayInitialize(i_unused,0); 38 | //--- write history file header 39 | FileWriteInteger(ExtHandle,file_version,LONG_VALUE); 40 | FileWriteString(ExtHandle,c_copyright,64); 41 | FileWriteString(ExtHandle,c_symbol,12); 42 | FileWriteInteger(ExtHandle,i_period,LONG_VALUE); 43 | FileWriteInteger(ExtHandle,i_digits,LONG_VALUE); 44 | FileWriteInteger(ExtHandle,0,LONG_VALUE); 45 | FileWriteInteger(ExtHandle,0,LONG_VALUE); 46 | FileWriteArray(ExtHandle,i_unused,0,13); 47 | //--- write history file 48 | periodseconds=i_period*60; 49 | start_pos=Bars-1; 50 | rate.open=Open[start_pos]; 51 | rate.low=Low[start_pos]; 52 | rate.high=High[start_pos]; 53 | rate.tick_volume=(long)Volume[start_pos]; 54 | rate.spread=0; 55 | rate.real_volume=0; 56 | //--- normalize open time 57 | rate.time=Time[start_pos]/periodseconds; 58 | rate.time*=periodseconds; 59 | for(i=start_pos-1; i>=0; i--) 60 | { 61 | if(IsStopped()) 62 | break; 63 | time0=Time[i]; 64 | //--- history may be updated 65 | if(i==0) 66 | { 67 | //--- modify index if history was updated 68 | if(RefreshRates()) 69 | i=iBarShift(NULL,0,time0); 70 | } 71 | //--- 72 | if(time0>=rate.time+periodseconds || i==0) 73 | { 74 | if(i==0 && time0Low[0]) 78 | rate.low=Low[0]; 79 | if(rate.high=rate.time+periodseconds) 88 | { 89 | rate.time=time0/periodseconds; 90 | rate.time*=periodseconds; 91 | rate.open=Open[i]; 92 | rate.low=Low[i]; 93 | rate.high=High[i]; 94 | rate.close=Close[i]; 95 | rate.tick_volume=last_volume; 96 | } 97 | } 98 | else 99 | { 100 | rate.tick_volume+=(long)Volume[i]; 101 | if(rate.low>Low[i]) 102 | rate.low=Low[i]; 103 | if(rate.highLow[0]) 128 | rate.low=Low[0]; 129 | if(rate.highLow[1]) 138 | rate.low=Low[1]; 139 | if(rate.high=0) 162 | { 163 | //--- find appropriate offline chart 164 | if(ChartSymbol(id)==Symbol() && ChartPeriod(id)==i_period && ChartGetInteger(id,CHART_IS_OFFLINE)) 165 | { 166 | chart_id=id; 167 | ChartSetInteger(chart_id,CHART_AUTOSCROLL,true); 168 | ChartSetInteger(chart_id,CHART_SHIFT,true); 169 | ChartNavigate(chart_id,CHART_END); 170 | ChartRedraw(chart_id); 171 | PrintFormat("Chart window [%s,%d] found",Symbol(),i_period); 172 | break; 173 | } 174 | //--- enumerate opened charts 175 | id=ChartNext(id); 176 | } 177 | } 178 | //--- refresh window not frequently than 1 time in 2 seconds 179 | if(chart_id!=0 && cur_time-last_time>=2) 180 | { 181 | ChartSetSymbolPeriod(chart_id,Symbol(),i_period); 182 | last_time=cur_time; 183 | } 184 | } 185 | Sleep(50); 186 | } 187 | //--- 188 | } 189 | //+------------------------------------------------------------------+ 190 | //| | 191 | //+------------------------------------------------------------------+ 192 | void OnDeinit(const int reason) 193 | { 194 | //--- 195 | if(ExtHandle>=0) 196 | { 197 | FileClose(ExtHandle); 198 | ExtHandle=-1; 199 | } 200 | //--- 201 | } 202 | //+------------------------------------------------------------------+ -------------------------------------------------------------------------------- /files/MQL4/Scripts/mqlcache.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/MQL4/Scripts/mqlcache.dat -------------------------------------------------------------------------------- /files/compile.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | cd `dirname $0` 3 | echo "compiling" $1 4 | wine metaeditor.exe /compile:MQL4/Experts/$1 /log 5 | -------------------------------------------------------------------------------- /files/compiler: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/compiler -------------------------------------------------------------------------------- /files/metaeditor.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/metaeditor.exe -------------------------------------------------------------------------------- /files/simpleServer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocamin/mql4-compiler-docker/38567f1aa3a592bf8fd184cf778674c838b2a2d4/files/simpleServer -------------------------------------------------------------------------------- /sample.mq4: -------------------------------------------------------------------------------- 1 | //+------------------------------------------------------------------+ 2 | //| MACD Sample.mq4 | 3 | //| Copyright 2005-2014, MetaQuotes Software Corp. | 4 | //| http://www.mql4.com | 5 | //+------------------------------------------------------------------+ 6 | #property copyright "2005-2014, MetaQuotes Software Corp." 7 | #property link "http://www.mql4.com" 8 | 9 | input double TakeProfit =50; 10 | input double Lots =0.1; 11 | input double TrailingStop =30; 12 | input double MACDOpenLevel =3; 13 | input double MACDCloseLevel=2; 14 | input int MATrendPeriod =26; 15 | //+------------------------------------------------------------------+ 16 | //| | 17 | //+------------------------------------------------------------------+ 18 | void OnTick(void) 19 | { 20 | double MacdCurrent,MacdPrevious; 21 | double SignalCurrent,SignalPrevious; 22 | double MaCurrent,MaPrevious; 23 | int cnt,ticket,total; 24 | //--- 25 | // initial data checks 26 | // it is important to make sure that the expert works with a normal 27 | // chart and the user did not make any mistakes setting external 28 | // variables (Lots, StopLoss, TakeProfit, 29 | // TrailingStop) in our case, we check TakeProfit 30 | // on a chart of less than 100 bars 31 | //--- 32 | if(Bars<100) 33 | { 34 | Print("bars less than 100"); 35 | return; 36 | } 37 | if(TakeProfit<10) 38 | { 39 | Print("TakeProfit less than 10"); 40 | return; 41 | } 42 | //--- to simplify the coding and speed up access data are put into internal variables 43 | MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); 44 | MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); 45 | SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); 46 | SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); 47 | MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); 48 | MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); 49 | 50 | total=OrdersTotal(); 51 | if(total<1) 52 | { 53 | //--- no opened orders identified 54 | if(AccountFreeMargin()<(1000*Lots)) 55 | { 56 | Print("We have no money. Free Margin = ",AccountFreeMargin()); 57 | return; 58 | } 59 | //--- check for long position (BUY) possibility 60 | if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDOpenLevel*Point) && MaCurrent>MaPrevious) 62 | { 63 | ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); 64 | if(ticket>0) 65 | { 66 | if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 67 | Print("BUY order opened : ",OrderOpenPrice()); 68 | } 69 | else 70 | Print("Error opening BUY order : ",GetLastError()); 71 | return; 72 | } 73 | //--- check for short position (SELL) possibility 74 | if(MacdCurrent>0 && MacdCurrentSignalPrevious && 75 | MacdCurrent>(MACDOpenLevel*Point) && MaCurrent0) 79 | { 80 | if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 81 | Print("SELL order opened : ",OrderOpenPrice()); 82 | } 83 | else 84 | Print("Error opening SELL order : ",GetLastError()); 85 | } 86 | //--- exit from the "no opened orders" block 87 | return; 88 | } 89 | //--- it is important to enter the market correctly, but it is more important to exit it correctly... 90 | for(cnt=0;cnt0 && MacdCurrentSignalPrevious && 102 | MacdCurrent>(MACDCloseLevel*Point)) 103 | { 104 | //--- close order and exit 105 | if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) 106 | Print("OrderClose error ",GetLastError()); 107 | return; 108 | } 109 | //--- check for trailing stop 110 | if(TrailingStop>0) 111 | { 112 | if(Bid-OrderOpenPrice()>Point*TrailingStop) 113 | { 114 | if(OrderStopLoss()SignalCurrent && 128 | MacdPrevious(MACDCloseLevel*Point)) 129 | { 130 | //--- close order and exit 131 | if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) 132 | Print("OrderClose error ",GetLastError()); 133 | return; 134 | } 135 | //--- check for trailing stop 136 | if(TrailingStop>0) 137 | { 138 | if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) 139 | { 140 | if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) 141 | { 142 | //--- modify order and exit 143 | if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) 144 | Print("OrderModify error ",GetLastError()); 145 | return; 146 | } 147 | } 148 | } 149 | } 150 | } 151 | } 152 | //--- 153 | } 154 | //+------------------------------------------------------------------+ 155 | --------------------------------------------------------------------------------