Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //+------------------------------------------------------------------+
- //| claude-test_3ma_user.mq5 - Claude による移植テスト |
- //| (殆ど自動だが、ビルドエラーが出る部分や表示がおかしくなる部分等は、 |
- //| MT4との違いをGemini等に尋ねながら別途修正する必要がある模様…) |
- //| |
- //| MT4版 test_3ma_user.mq4 の MT5移植版 |
- //| 元コード: https://pastebin.com/6jvBeEfi |
- //| |
- //| MT4→MT5 主な変更点 by Claude : |
- //| 1. iMA() → CHyrIQueueMA クラスに置き換え |
- //| 2. OrderSend() → MT5スタイル (MqlTradeRequest) に変更 |
- //| 3. OrderSelect/OrdersTotal → PositionSelect 系に変更 |
- //| 4. Bid/Ask → SymbolInfoDouble() に変更 |
- //| 5. ObjectSet() → ObjectSetInteger/Double/String に統一 |
- //| 6. stdlib.mqh → 不要なので削除、ErrorDescription→独自実装 |
- //| 7. OP_BUY/OP_SELL → ORDER_TYPE_BUY/ORDER_TYPE_SELL に変更 |
- //+------------------------------------------------------------------+
- #property copyright "2024-2026, (c)hyrolean"
- #property link "https://pastebin.com/C7W6v04x"
- #property version "1.01"
- // version 1.01
- // - 発注プロセスを多少改善
- #include <Trade/Trade.mqh> // MT5の発注ライブラリ
- #include <User/hyrGlobal.mqh> // https://pastebin.com/2PdBW6NQ
- #include <User/hyrStatus.mqh> // https://pastebin.com/d9Z8P2qD
- #include <User/hyrIQueue.mqh> // https://pastebin.com/3pRKTce4
- #include <User/hyrTmpl.mqh> // https://pastebin.com/LG1vurny
- //+------------------------------------------------------------------+
- //| 定数・列挙型 |
- //+------------------------------------------------------------------+
- #define ENTRY_NAME "3MAUser"
- #define MAShift 0
- #define ORDER_RETRY 10
- #define ORDER_RETRY_SLEEP 100
- #define ORDER_RETRY_DURATION 1000
- #define SELLBTN_NAME "EntrySell"
- #define BUYBTN_NAME "EntryBuy"
- #define CLOSEALLBTN_NAME "CloseAll"
- #define CLOSELONGBTN_NAME "CloseLong"
- #define CLOSESHORTBTN_NAME "CloseShort"
- #define FLUSHTLBTN_NAME "FlushTL"
- #define OFFTIME_NAME "OFF TIME"
- #define AMOUNT_NAME "AMOUNT"
- #define DBGINFO_NAME "DEBUG INFO"
- enum ENUM_POSI {
- POSI_STOP,
- POSI_ONLY_LONG,
- POSI_ONLY_SHORT,
- POSI_HALF_LONG_AND_SHORT,
- POSI_FULL_LONG_AND_SHORT
- };
- //+------------------------------------------------------------------+
- //| 入力パラメーター |
- //+------------------------------------------------------------------+
- input bool Automation = true;
- input ENUM_TIMEFRAMES MainTimeFrame = PERIOD_CURRENT;
- input int MAGICMA = 0;
- input bool TimeControl = false;
- input ENUM_TIMEBASE TimeBase = TIMEBASE_LOCAL;
- input string TimeStart = "09:00";
- input string TimeEnd = "15:00";
- input ENUM_TIMEACT TimeAction = TIMEACT_NONE;
- input ENUM_MA_METHOD MAMode = MODE_EMA;
- input ENUM_APPLIED_PRICE MAPriceType = PRICE_CLOSE;
- input bool MA3 = true;
- input int MA3FastPeriod = 10;
- input int MA3MediumPeriod = 20;
- input int MA3SlowPeriod = 50;
- input int MA3TLPeriod = 5;
- input int Slippage = 10;
- input int Spread = 50;
- input double BaseLots = 0.1;
- input double StepLots = 0.01;
- input double MinLots = 0.01;
- input double MaxLots = 50.0;
- input double LotsDenomTL = 3.0;
- input double LotsDenomMAFast = 2.0;
- input double Takeprofit = 0;
- input double Stoploss = 200;
- input double MaxGrosslossPer = 25;
- input bool Compounding = false;
- input double CompoundingBase = 100000;
- input bool BalanceIncludeCredit = true;
- input bool Trailing = false;
- input double TrailingStart = 300;
- input double TrailingStop = 200;
- input bool ShowUserEntry = true;
- input bool ShowCloseAll = true;
- input bool ShowCloseLong = false;
- input bool ShowCloseShort = false;
- input bool ShowFlushTL = true;
- input bool ShowAmount = true;
- input int AmountDig = 0;
- input color ClrAmountPosi = clrLightGoldenrod;
- input color ClrAmountNega = clrLightPink;
- input color ClrTimeControl = clrYellow;
- input color ClrLongArrow = clrBlue;
- input color ClrShortArrow = clrRed;
- input bool DBGMODE = true;
- //+------------------------------------------------------------------+
- //| グローバル変数 |
- //+------------------------------------------------------------------+
- double Lots, PrevBid, PrevAsk;
- datetime CurTime, TimeTick, StartTime, CancelTime, UserTime;
- int UserEntry = 0;
- bool FlushTL = false;
- bool OffTimeVisible = false;
- //--- MT5発注ライブラリ
- CTrade Trade;
- //--- IQueue MA (3本分)
- CHyrIQueueMA gFastMA, gMediumMA, gSlowMA;
- //--- IQueue ATR14 (デバッグ用)
- CHyrIQueueATR gATR14;
- //+------------------------------------------------------------------+
- //| ユーティリティ |
- //+------------------------------------------------------------------+
- double GetBid() { return SymbolInfoDouble(_Symbol, SYMBOL_BID); }
- double GetAsk() { return SymbolInfoDouble(_Symbol, SYMBOL_ASK); }
- double AdjLots(double lots)
- {
- double roundLots = MathRound(MathMax(lots, StepLots) / StepLots);
- return MathMin(MathMax(roundLots * StepLots, MinLots), MaxLots);
- }
- void DBGOUT(string text)
- {
- if(DBGMODE)
- ObjectSetString(0, DBGINFO_NAME, OBJPROP_TEXT, text);
- }
- //--- メインタイムを返す
- datetime MainTime(int shift = 0)
- {
- return iTime(_Symbol, MainTimeFrame, shift);
- }
- int MainPeriod()
- {
- int period = (int)MainTimeFrame;
- if(!period) period = (int)Period();
- return period;
- }
- //+------------------------------------------------------------------+
- //| 注文の発注 (MT5版) |
- //+------------------------------------------------------------------+
- ulong MakeOrder(ENUM_ORDER_TYPE entryType, double lots, double sl, double tp,
- string detector, int magic, double entryPrice = 0.0)
- {
- string entryName = ENTRY_NAME"(" + detector + ")";
- double bid = GetBid(), ask = GetAsk();
- uint start = GetTickCount();
- string lastError;
- for(int retry = 0; retry < ORDER_RETRY; retry++) {
- //--- スプレッドチェック
- lastError="";
- double spreadPts = (double)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
- bool cancel=false ;
- if((entryType == ORDER_TYPE_BUY || entryType == ORDER_TYPE_SELL) && spreadPts > Spread) {
- cancel=true; retry--; lastError = "spread expanding." ;
- }
- if(!cancel) {
- double price = entryPrice;
- if(price == 0.0)
- price = (entryType == ORDER_TYPE_BUY) ? ask : bid;
- Trade.SetExpertMagicNumber(magic);
- Trade.SetDeviationInPoints(Slippage);
- bool res = false;
- if(entryType == ORDER_TYPE_BUY)
- res = Trade.Buy(lots, _Symbol, price, sl, tp, entryName);
- else if(entryType == ORDER_TYPE_SELL)
- res = Trade.Sell(lots, _Symbol, price, sl, tp, entryName);
- if(res) return Trade.ResultOrder();
- }
- if(GetTickCount()-start>=ORDER_RETRY_DURATION) break;
- Sleep(ORDER_RETRY_SLEEP);
- }
- if(lastError!="")
- PrintMessage(lastError);
- else
- PrintLastError();
- return 0;
- }
- //+------------------------------------------------------------------+
- //| 注文の決済 (MT5版) |
- //+------------------------------------------------------------------+
- bool CheckoutOrder(ENUM_ORDER_TYPE orderType, ulong ticket, double orderLots)
- {
- uint start = GetTickCount();
- for(int retry = 0; retry < ORDER_RETRY; retry++) {
- bool res = Trade.PositionClosePartial(ticket, orderLots, Slippage);
- if(res) return true;
- if(GetTickCount()-start>=ORDER_RETRY_DURATION) break;
- Sleep(ORDER_RETRY_SLEEP);
- }
- PrintLastError();
- return false;
- }
- struct OBJECT_CHECKOUT {
- ulong Ticket;
- double Profit;
- OBJECT_CHECKOUT() { Ticket = 0; Profit = 0.0; }
- OBJECT_CHECKOUT(ulong Ticket_, double Profit_) { Ticket = Ticket_; Profit = Profit_; }
- bool operator <(const OBJECT_CHECKOUT &rhs) const { return Profit < rhs.Profit; }
- };
- bool CheckoutOrderAll(int orderFlag, double lotsDenom = 1.0)
- {
- bool result = true;
- CArrayObj *array = new CArrayObj();
- int total = PositionsTotal();
- for(int i = 0; i < total; i++) {
- ulong ticket = PositionGetTicket(i);
- if(ticket == 0) continue;
- if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
- if((int)PositionGetInteger(POSITION_MAGIC) != MAGICMA) continue;
- ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
- bool isBuy = (posType == POSITION_TYPE_BUY && (orderFlag & FLAG_BUY) != 0);
- bool isSell = (posType == POSITION_TYPE_SELL && (orderFlag & FLAG_SELL) != 0);
- if(isBuy || isSell)
- AddToArray(array, OBJECT_CHECKOUT(ticket, PositionGetDouble(POSITION_PROFIT)));
- }
- array.Sort(ARRAY_SORT_DESCEND);
- for(int i = 0; i < array.Total(); i++) {
- CSortable<OBJECT_CHECKOUT> *node = (CSortable<OBJECT_CHECKOUT>*)array.At(i);
- if(PositionSelectByTicket(node.v.Ticket)) {
- double lots = PositionGetDouble(POSITION_VOLUME) / lotsDenom;
- ENUM_POSITION_TYPE pt = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
- ENUM_ORDER_TYPE ot = (pt == POSITION_TYPE_BUY) ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
- if(!CheckoutOrder(ot, node.v.Ticket, lots)) { result = false; break; }
- }
- }
- delete array;
- return result;
- }
- //+------------------------------------------------------------------+
- //| マニュアルポジション発注 |
- //+------------------------------------------------------------------+
- ulong EntryManualPosition(string detector, ENUM_ORDER_TYPE entryType, double lots)
- {
- double bid = GetBid(), ask = GetAsk();
- double sl = 0.0, tp = 0.0;
- if(entryType == ORDER_TYPE_BUY) {
- if(Stoploss != 0.0) sl = ask - Stoploss * _Point;
- if(Takeprofit != 0.0) tp = ask + Takeprofit * _Point;
- } else {
- if(Stoploss != 0.0) sl = bid + Stoploss * _Point;
- if(Takeprofit != 0.0) tp = bid - Takeprofit * _Point;
- }
- if(sl == 0.0 && MaxGrosslossPer >= 100.0) {
- double halfSpread = (ask - bid) / 2.0;
- //--- SlowMAの現在値チェック(MAQueueから取得)
- double slowMA0 = gSlowMA[0] + halfSpread;
- if(entryType == ORDER_TYPE_BUY ? slowMA0 >= ask : slowMA0 <= bid) {
- PrintMessage("Entrying failed due to Slow MA over price reached");
- return 0;
- }
- }
- return MakeOrder(entryType, lots, sl, tp, detector, MAGICMA);
- }
- //+------------------------------------------------------------------+
- //| 金額表示 |
- //+------------------------------------------------------------------+
- void UpdateAmount(double amount, int positions)
- {
- if(!ShowAmount) return;
- if(positions > 0) {
- string s = DoubleToAmount(amount, AmountDig);
- if(amount > 0) s = "+" + s;
- ObjectSetString(0, AMOUNT_NAME, OBJPROP_TEXT, s);
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_COLOR,
- amount < 0 ? ClrAmountNega : ClrAmountPosi);
- } else {
- string s = ObjectGetString(0, AMOUNT_NAME, OBJPROP_TEXT);
- int ln = StringLen(s);
- if(ln > 0 && s[ln-1] != '-')
- ObjectSetString(0, AMOUNT_NAME, OBJPROP_TEXT, s + "-");
- }
- }
- //+------------------------------------------------------------------+
- //| タイムコントロール |
- //+------------------------------------------------------------------+
- void CheckTimeControl(bool nextTicked)
- {
- if(!TimeControl) {
- if(OffTimeVisible) {
- ObjectDelete(0,OFFTIME_NAME);
- OffTimeVisible = false ;
- }
- return ;
- }
- if(!nextTicked) return ;
- if(!ControlTimeAction(
- TimeTick,StringToTime(TimeStart),StringToTime(TimeEnd),
- StartTime,MAGICMA,TimeAction)) {
- datetime timOff = StartTime - TimeTick ;
- if(!OffTimeVisible) {
- // OFF TIME テキストを表示
- ObjectCreate(0, OFFTIME_NAME, OBJ_LABEL, 0, 0, 0);
- ObjectSetInteger(0, OFFTIME_NAME, OBJPROP_XDISTANCE, 10);
- ObjectSetInteger(0, OFFTIME_NAME, OBJPROP_YDISTANCE, 25);
- ObjectSetInteger(0, OFFTIME_NAME, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
- ObjectSetInteger(0, OFFTIME_NAME, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
- ObjectSetString (0, OFFTIME_NAME, OBJPROP_TEXT, "OFF TIME");
- ObjectSetString (0, OFFTIME_NAME, OBJPROP_FONT, "Verdana");
- ObjectSetInteger(0, OFFTIME_NAME, OBJPROP_FONTSIZE, 8);
- ObjectSetInteger(0, OFFTIME_NAME, OBJPROP_COLOR, ClrTimeControl);
- OffTimeVisible = true ;
- }
- }else if(OffTimeVisible) {
- ObjectDelete(0, OFFTIME_NAME);
- OffTimeVisible = false ;
- }
- }
- //+------------------------------------------------------------------+
- //| オーダーの処理(3EMAロジック) |
- //+------------------------------------------------------------------+
- void ProcessOrders(bool nextTimed, ENUM_ORDER_TYPE orderType,
- const STATUS &status, const STATUS &revStatus)
- {
- if(status.Positions <= 0) return;
- double bid = GetBid(), ask = GetAsk();
- bool isBuy = (orderType == ORDER_TYPE_BUY);
- // トレーリング
- if(Trailing) {
- double tstart = TrailingStart * _Point;
- double tstop = TrailingStop * _Point;
- double minPad = tstart + tstop;
- for(int i=0;i<status.OrdersCount();i++) {
- COrderStatus *order = status.OrdersAt(isBuy ? status.Positions-1-i : i);
- if(isBuy ? order.Price > bid - minPad : order.Price < ask + minPad) break;
- double sl = 0.0;
- if(order.Stoploss == 0.0 ||
- (isBuy ? order.Stoploss < order.Price : order.Stoploss > order.Price))
- sl = isBuy ? order.Price + tstart : order.Price - tstart;
- else
- sl = order.Stoploss;
- while((isBuy ? bid - sl : sl - ask) >= tstop * 2)
- sl += isBuy ? +tstop : -tstop;
- if(!InnerPoint(sl, order.Stoploss)) {
- Trade.PositionModify(order.Ticket, sl, order.Takeprofit);
- order.Stoploss = sl;
- }
- }
- }
- // 3EMA処理
- if(MA3 && (nextTimed || FlushTL)) {
- double halfSpread = (ask - bid) / 2.0;
- //--- MAQueueから現在値を取得([0]=最新バー)
- double FastMA0 = gFastMA[0] + halfSpread;
- double MediumMA0 = gMediumMA[0] + halfSpread;
- double SlowMA0 = gSlowMA[0] + halfSpread;
- for(int i = status.OrdersCount() - 1; i >= 0; i--) {
- COrderStatus *order = status.OrdersAt(isBuy ? status.Positions-1-i : i);
- double price = order.Price;
- double sl = order.Stoploss;
- double trail_sl = 0.0;
- double checkout_denom = 0.0;
- string checkout_reason = "";
- if(InnerPoint(sl, price)) {
- if(FlushTL && !nextTimed) continue;
- if(!InnerPoint(MediumMA0, price) &&
- (isBuy ? MediumMA0-halfSpread > price : MediumMA0+halfSpread < price)) {
- if(isBuy ? FastMA0 > ask : FastMA0 < bid) {
- checkout_denom = LotsDenomMAFast;
- checkout_reason = "Check-out by Fast MA";
- if(isBuy ? MediumMA0 > ask : MediumMA0 < bid)
- { checkout_reason += " & Medium MA"; checkout_denom = 1.0; }
- trail_sl = MediumMA0 + (isBuy ? -halfSpread : +halfSpread);
- }
- }
- } else if(sl != 0.0 && (isBuy ? sl > price : sl < price)) {
- if(FlushTL && !nextTimed) continue;
- if(isBuy ? ask <= MediumMA0 : bid >= MediumMA0) {
- checkout_denom = 1.0;
- checkout_reason = "Check-out by Medium MA";
- }
- } else {
- if(FlushTL || MA3TLPeriod > 0) {
- datetime tperiod = (datetime)(MainPeriod() * 60);
- int period = (int)((CurTime - order.OpenTime) / tperiod);
- if(FlushTL || period >= MA3TLPeriod - 1) {
- if(isBuy ? bid > price : ask < price) {
- if(!FlushTL && (isBuy ? FastMA0>ask||MediumMA0>ask : FastMA0<bid||MediumMA0<bid)) {
- trail_sl = price + (isBuy ? -_Point : +_Point);
- } else {
- checkout_denom = LotsDenomTL;
- checkout_reason = "Check-out by TL(TimeLimited)";
- trail_sl = price;
- }
- }
- }
- }
- if(!FlushTL || nextTimed) {
- if(sl == 0.0 && MaxGrosslossPer >= 100.0) {
- if(isBuy ? ask <= SlowMA0 : bid >= SlowMA0) {
- checkout_denom = 1.0;
- checkout_reason = "Loss-cut order by Slow MA";
- }
- }
- }
- }
- if(trail_sl != 0.0) {
- if(sl==0.0 || (!InnerPoint(sl,trail_sl) && (isBuy ? sl<trail_sl : sl>trail_sl))) {
- sl = trail_sl;
- Trade.PositionModify(order.Ticket, sl, order.Takeprofit);
- order.Stoploss = sl;
- }
- }
- if(checkout_denom > 0.0) {
- double lots = AdjLots(order.Lots / checkout_denom);
- if(lots < MinLots) lots = MinLots;
- if(lots > order.Lots) lots = order.Lots;
- if(CheckoutOrder(orderType, order.Ticket, lots)) {
- PrintMessage(checkout_reason);
- order.Lots -= lots;
- }
- }
- }
- }
- }
- //+------------------------------------------------------------------+
- //| 動作チェック |
- //+------------------------------------------------------------------+
- void CheckBehavior(bool nextTimed)
- {
- if(Compounding) {
- double balance = AccountInfoDouble(ACCOUNT_BALANCE);
- if(BalanceIncludeCredit) balance += AccountInfoDouble(ACCOUNT_CREDIT);
- Lots = balance * BaseLots / CompoundingBase;
- if(Lots < MinLots) Lots = MinLots;
- if(Lots > MaxLots) Lots = MaxLots;
- }
- STATUS BuyStatus, SellStatus;
- CheckStatus(OP_BUY, MAGICMA, &BuyStatus);
- CheckStatus(OP_SELL, MAGICMA, &SellStatus);
- double curAmount = BuyStatus.GrossProfit + SellStatus.GrossProfit;
- int curPositions = BuyStatus.Positions + SellStatus.Positions;
- UpdateAmount(curAmount, curPositions);
- if(Automation) {
- if(curAmount < 0) {
- double balance = AccountInfoDouble(ACCOUNT_BALANCE);
- if(BalanceIncludeCredit) balance += AccountInfoDouble(ACCOUNT_CREDIT);
- if(balance * MaxGrosslossPer / 100.0 < -curAmount) {
- CheckoutOrderAll(FLAG_BUY | FLAG_SELL);
- PrintMessage("Check-out orders by over Maximum Gross Loss");
- return;
- }
- }
- ProcessOrders(nextTimed, ORDER_TYPE_BUY, BuyStatus, SellStatus);
- ProcessOrders(nextTimed, ORDER_TYPE_SELL, SellStatus, BuyStatus);
- }
- FlushTL = false;
- }
- //+------------------------------------------------------------------+
- //| OnInit |
- //+------------------------------------------------------------------+
- int OnInit()
- {
- //--- IQueue MA 初期化(3本分)
- int qsize = MA3SlowPeriod * 3; // 余裕を持ったキューサイズ
- if(!gFastMA.Init (_Symbol, MainTimeFrame, MA3FastPeriod, MAMode, MAPriceType, qsize) ||
- !gMediumMA.Init(_Symbol, MainTimeFrame, MA3MediumPeriod, MAMode, MAPriceType, qsize) ||
- !gSlowMA.Init (_Symbol, MainTimeFrame, MA3SlowPeriod, MAMode, MAPriceType, qsize))
- return INIT_FAILED;
- //--- IQueue ATR 14 (デバッグ用)
- if(!gATR14.Init (_Symbol, PERIOD_CURRENT, 14, 2))
- return INIT_FAILED;
- CurTime = MainTime();
- TimeTick = CancelTime = StartTime = UserTime = BaseTime(TimeBase);
- Lots = AdjLots(BaseLots);
- PrevBid = GetBid();
- PrevAsk = GetAsk();
- GlobalSettings(
- ENTRY_NAME,
- Slippage,
- Spread,
- ORDER_RETRY,
- ORDER_RETRY_SLEEP,
- ORDER_RETRY_DURATION );
- //--- UI オブジェクト作成
- if(DBGMODE) {
- ObjectCreate(0, DBGINFO_NAME, OBJ_LABEL, 0, 0, 0);
- ObjectSetInteger(0, DBGINFO_NAME, OBJPROP_XDISTANCE, 10);
- ObjectSetInteger(0, DBGINFO_NAME, OBJPROP_YDISTANCE, 15);
- ObjectSetInteger(0, DBGINFO_NAME, OBJPROP_CORNER, CORNER_RIGHT_LOWER);
- ObjectSetInteger(0, DBGINFO_NAME, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER);
- ObjectSetString (0, DBGINFO_NAME, OBJPROP_TEXT, "DEBUG INFO");
- ObjectSetString (0, DBGINFO_NAME, OBJPROP_FONT, "Verdana");
- ObjectSetInteger(0, DBGINFO_NAME, OBJPROP_FONTSIZE, 8);
- ObjectSetInteger(0, DBGINFO_NAME, OBJPROP_COLOR, clrAquamarine);
- }
- if(ShowAmount) {
- ObjectCreate(0, AMOUNT_NAME, OBJ_LABEL, 0, 0, 0);
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_XDISTANCE, 20);
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_YDISTANCE, 35);
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_CORNER, CORNER_RIGHT_LOWER);
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER);
- ObjectSetString (0, AMOUNT_NAME, OBJPROP_TEXT, "0-");
- ObjectSetString (0, AMOUNT_NAME, OBJPROP_FONT, "Verdana");
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_FONTSIZE, 15);
- ObjectSetInteger(0, AMOUNT_NAME, OBJPROP_COLOR, ClrAmountPosi);
- }
- if(ShowUserEntry) {
- ObjectCreate(0, SELLBTN_NAME, OBJ_BUTTON, 0, 0, 0);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_XDISTANCE, 10);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_YDISTANCE, 20);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_XSIZE, 58);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_YSIZE, 32);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_CORNER, CORNER_LEFT_UPPER);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_FONTSIZE, 12);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_COLOR, clrWhite);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_BGCOLOR, clrFireBrick);
- ObjectSetString (0, SELLBTN_NAME, OBJPROP_TEXT, "SELL");
- ObjectSetString (0, SELLBTN_NAME, OBJPROP_FONT, "Verdana");
- ObjectCreate(0, BUYBTN_NAME, OBJ_BUTTON, 0, 0, 0);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_XDISTANCE, 70);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_YDISTANCE, 20);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_XSIZE, 58);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_YSIZE, 32);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_CORNER, CORNER_LEFT_UPPER);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_FONTSIZE, 12);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_COLOR, clrWhite);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_BGCOLOR, clrRoyalBlue);
- ObjectSetString (0, BUYBTN_NAME, OBJPROP_TEXT, "BUY");
- ObjectSetString (0, BUYBTN_NAME, OBJPROP_FONT, "Verdana");
- }
- int btn_ofs_x = 0;
- const int btn_distance = 102;
- if(ShowCloseAll) {
- ObjectCreate(0, CLOSEALLBTN_NAME, OBJ_BUTTON, 0, 0, 0);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_XDISTANCE, 10 + btn_ofs_x);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_YDISTANCE, 35);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_XSIZE, 100);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_YSIZE, 25);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_CORNER, CORNER_LEFT_LOWER);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_FONTSIZE, 10);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_COLOR, clrWhite);
- ObjectSetInteger(0, CLOSEALLBTN_NAME, OBJPROP_BGCOLOR, clrDarkSlateGray);
- ObjectSetString (0, CLOSEALLBTN_NAME, OBJPROP_TEXT, "CLOSE ALL");
- ObjectSetString (0, CLOSEALLBTN_NAME, OBJPROP_FONT, "Verdana");
- btn_ofs_x += btn_distance;
- }
- if(ShowCloseLong) {
- ObjectCreate(0, CLOSELONGBTN_NAME, OBJ_BUTTON, 0, 0, 0);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_XDISTANCE, 10 + btn_ofs_x);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_YDISTANCE, 35);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_XSIZE, 100);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_YSIZE, 25);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_CORNER, CORNER_LEFT_LOWER);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_FONTSIZE, 10);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_COLOR, clrWhite);
- ObjectSetInteger(0, CLOSELONGBTN_NAME, OBJPROP_BGCOLOR, clrRoyalBlue);
- ObjectSetString (0, CLOSELONGBTN_NAME, OBJPROP_TEXT, "CLOSE LONG");
- ObjectSetString (0, CLOSELONGBTN_NAME, OBJPROP_FONT, "Verdana");
- btn_ofs_x += btn_distance;
- }
- if(ShowCloseShort) {
- ObjectCreate(0, CLOSESHORTBTN_NAME, OBJ_BUTTON, 0, 0, 0);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_XDISTANCE, 10 + btn_ofs_x);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_YDISTANCE, 35);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_XSIZE, 100);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_YSIZE, 25);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_CORNER, CORNER_LEFT_LOWER);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_FONTSIZE, 10);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_COLOR, clrWhite);
- ObjectSetInteger(0, CLOSESHORTBTN_NAME, OBJPROP_BGCOLOR, clrFireBrick);
- ObjectSetString (0, CLOSESHORTBTN_NAME, OBJPROP_TEXT, "CLOSE SHORT");
- ObjectSetString (0, CLOSESHORTBTN_NAME, OBJPROP_FONT, "Verdana");
- btn_ofs_x += btn_distance;
- }
- if(ShowFlushTL) {
- ObjectCreate(0, FLUSHTLBTN_NAME, OBJ_BUTTON, 0, 0, 0);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_XDISTANCE, 10 + btn_ofs_x);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_YDISTANCE, 35);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_XSIZE, 100);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_YSIZE, 25);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_CORNER, CORNER_LEFT_LOWER);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_FONTSIZE, 10);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_COLOR, clrWhite);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_BGCOLOR, clrDarkSlateBlue);
- ObjectSetString (0, FLUSHTLBTN_NAME, OBJPROP_TEXT, "FLUSH TL");
- ObjectSetString (0, FLUSHTLBTN_NAME, OBJPROP_FONT, "Verdana");
- }
- UserEntry = 0;
- return INIT_SUCCEEDED;
- }
- //+------------------------------------------------------------------+
- //| OnDeinit |
- //+------------------------------------------------------------------+
- void OnDeinit(const int reason)
- {
- if(ShowFlushTL) ObjectDelete(0, FLUSHTLBTN_NAME);
- if(ShowCloseShort) ObjectDelete(0, CLOSESHORTBTN_NAME);
- if(ShowCloseLong) ObjectDelete(0, CLOSELONGBTN_NAME);
- if(ShowCloseAll) ObjectDelete(0, CLOSEALLBTN_NAME);
- if(ShowUserEntry) { ObjectDelete(0, BUYBTN_NAME); ObjectDelete(0, SELLBTN_NAME); }
- if(OffTimeVisible) { ObjectDelete(0, OFFTIME_NAME); OffTimeVisible = false; }
- if(ShowAmount) ObjectDelete(0, AMOUNT_NAME);
- if(DBGMODE) ObjectDelete(0, DBGINFO_NAME);
- }
- //+------------------------------------------------------------------+
- //| OnTick |
- //+------------------------------------------------------------------+
- void OnTick()
- {
- //--- IQueue を更新
- gFastMA.Update();
- gMediumMA.Update();
- gSlowMA.Update();
- gATR14.Update();
- datetime nextTime = MainTime();
- bool nextTimed = (nextTime != CurTime);
- CurTime = nextTime;
- datetime nextTick = BaseTime(TimeBase);
- bool nextTicked = (nextTick != TimeTick);
- TimeTick = nextTick;
- CheckTimeControl(nextTicked);
- CheckBehavior(nextTimed);
- double bid = GetBid(), ask = GetAsk();
- double atr14 = gATR14[0];
- double spread = ask - bid;
- if(DBGMODE) {
- DBGOUT(
- StringFormat("ATR(14): %.3f", atr14/_Point) + " | " +
- StringFormat("SPREAD: %g", spread/_Point) + " | " +
- StringFormat("ATR(14)/SPREAD: %.3f", atr14/(spread<=0?1:spread))
- );
- }
- // エントリー処理
- if(AccountInfoInteger(ACCOUNT_TRADE_EXPERT) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) {
- int busy = AlreadyOrdered(FLAG_BUY|FLAG_SELL, MAGICMA);
- if(UserEntry && TimeTick - UserTime < 60) {
- int user = UserEntry;
- if(user) {
- ENUM_ORDER_TYPE entry = (user == FLAG_BUY) ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
- if(EntryManualPosition("USER", entry, Lots) > 0)
- busy |= user;
- else
- PlaySound("timeout.wav"); // 約定失敗
- UserEntry = 0;
- }
- } else { UserEntry = 0; }
- } else {
- if(StartTime - TimeTick < 10) StartTime = TimeTick + 10;
- }
- PrevBid = bid; PrevAsk = ask;
- }
- //+------------------------------------------------------------------+
- //| OnChartEvent |
- //+------------------------------------------------------------------+
- void OnChartEvent(const int id, const long &lparam,
- const double &dparam, const string &sparam)
- {
- if(id == CHARTEVENT_OBJECT_CLICK) {
- if(sparam == CLOSEALLBTN_NAME || sparam == CLOSELONGBTN_NAME || sparam == CLOSESHORTBTN_NAME) {
- int flag = 0;
- if(sparam == CLOSEALLBTN_NAME) flag = FLAG_SELL|FLAG_BUY;
- else if(sparam == CLOSELONGBTN_NAME) flag = FLAG_BUY;
- else if(sparam == CLOSESHORTBTN_NAME) flag = FLAG_SELL;
- CheckoutOrderAll(flag);
- Sleep(100);
- ObjectSetInteger(0, sparam, OBJPROP_STATE, false);
- CancelTime = TimeTick + 60;
- }
- if(sparam == FLUSHTLBTN_NAME) {
- FlushTL = true;
- Sleep(100);
- ObjectSetInteger(0, FLUSHTLBTN_NAME, OBJPROP_STATE, false);
- }
- if(sparam == SELLBTN_NAME) {
- UserEntry = FLAG_SELL; CancelTime = UserTime = TimeTick; CancelTime += 60;
- Sleep(100);
- ObjectSetInteger(0, SELLBTN_NAME, OBJPROP_STATE, false);
- }
- if(sparam == BUYBTN_NAME) {
- UserEntry = FLAG_BUY; CancelTime = UserTime = TimeTick; CancelTime += 60;
- Sleep(100);
- ObjectSetInteger(0, BUYBTN_NAME, OBJPROP_STATE, false);
- }
- }
- }
- //+------------------------------------------------------------------+
Advertisement
Add Comment
Please, Sign In to add comment