Ron Black's 'Getting Clear With Short-Term Swings'

Strategies are published here.

Moderator: admin

Ron Black's 'Getting Clear With Short-Term Swings'

Postby sunshine » Tue Aug 09, 2011 6:32 am

The strategy is based on Ron Black's Clear Method indicator.

Rules:
1) The strategy enters long when RB Clear indicator switches up.
2) The strategy enters short when RB Clear indicator switches down.
3) The strategy closes all opposite positions first.

Options:
1) The strategy can show signals (alerts, sounds (including recurrent), emails) as well as can trade. By default trading is disabled. To let the strategy trade please go to the "Trading Parameters" and switch "Allow strategy to trade" parameter to "Yes".
2) In trading parameters you can also switch on and configure stop and limit orders.

Please, do not forget to download and install the Ron Black's Clear Method indicator (rb_clear.lua).

rb_clear_strategy.png


Download strategy:

rb_clear_strategy.lua
(11.91 KiB) Downloaded 1139 times


Code: Select all
function Init()
    strategy:name("Clear Method Strategy");
    strategy:description("Signals when Ron Black's clear method indicator changes direction");

    strategy.parameters:addGroup("Price Parameters");
    strategy.parameters:addString("Type", "Price type", "", "Bid");
    strategy.parameters:addStringAlternative("Type", "Bid", "", "Bid");
    strategy.parameters:addStringAlternative("Type", "Ask", "", "Ask");
    strategy.parameters:addString("TF", "Timeframe", "", "m1");
    strategy.parameters:setFlag("TF", core.FLAG_PERIODS);

    strategy.parameters:addGroup("Trading Parameters");
    strategy.parameters:addBoolean("AllowTrade", "Allow strategy to trade", "", false);
    strategy.parameters:addString("Account", "Account to trade on", "", "");
    strategy.parameters:setFlag("Account", core.FLAG_ACCOUNT);
    strategy.parameters:addInteger("Amount", "Trade Amount in Lots", "", 1, 1, 100);
    strategy.parameters:addBoolean("SetLimit", "Set Limit Orders", "", false);
    strategy.parameters:addInteger("Limit", "Limit Order in pips", "", 30, 1, 10000);
    strategy.parameters:addBoolean("SetStop", "Set Stop Orders", "", false);
    strategy.parameters:addInteger("Stop", "Stop Order in pips", "", 30, 1, 10000);
    strategy.parameters:addBoolean("TrailingStop", "Trailing stop order", "", false);
    strategy.parameters:addString("AllowDirection", "Allow direction for positions", "", "Both");
    strategy.parameters:addStringAlternative("AllowDirection", "Both", "", "Both");
    strategy.parameters:addStringAlternative("AllowDirection", "Long", "", "Long");
    strategy.parameters:addStringAlternative("AllowDirection", "Short", "", "Short");

    strategy.parameters:addGroup("Signal Parameters");
    strategy.parameters:addBoolean("ShowAlert", "Show Alert", "", true);
    strategy.parameters:addBoolean("PlaySound", "Play Sound", "", false);
    strategy.parameters:addFile("SoundFile", "Sound File", "", "");
    strategy.parameters:setFlag("SoundFile", core.FLAG_SOUND)
    strategy.parameters:addBoolean("Recurrent", "RecurrentSound", "", false);

    strategy.parameters:addGroup("Email Parameters");
    strategy.parameters:addBoolean("SendEmail", "Send email", "", false);
    strategy.parameters:addString("Email", "Email address", "", "");
    strategy.parameters:setFlag("Email", core.FLAG_EMAIL);

end

-- Internal Parameters
local source = nil;
local clear;
 
-- Signal Parameters
local ShowAlert;
local SoundFile;
local RecurrentSound;
local SendEmail, Email;


-- Trading parameters
local AllowTrade = nil;
local Account = nil;
local Amount = nil;
local BaseSize = nil;
local PipSize;
local SetLimit = nil;
local Limit = nil;
local SetStop = nil;
local Stop = nil;
local TrailingStop = nil;
local CanClose = nil;
local AllowDirection;


function Prepare()
    assert(core.indicators:findIndicator("RB_CLEAR") ~= nil, "The RB_CLEAR.LUA indicator must be downloaded and installed");

    ShowAlert = instance.parameters.ShowAlert;

    AllowDirection = instance.parameters.AllowDirection;

    local PlaySound = instance.parameters.PlaySound;
    if PlaySound then
        SoundFile = instance.parameters.SoundFile;
    else
        SoundFile = nil;
    end

    assert(not(PlaySound) or (PlaySound and SoundFile ~= ""), "Sound file must be specified");

    RecurrentSound = instance.parameters.Recurrent;

    SendEmail = instance.parameters.SendEmail;
    if SendEmail then
        Email = instance.parameters.Email;
    else
        Email = nil;
    end
    assert(not(SendEmail) or (SendEmail and Email ~= ""), "Email address must be specified");

    assert(instance.parameters.TF ~= "t1", "The time frame must not be tick");

    local name;
    name = profile:id() .. "(" .. instance.bid:instrument()  .. "[" .. instance.parameters.TF  .. "]" .. ")";
    instance:name(name);

    AllowTrade = instance.parameters.AllowTrade;
    if AllowTrade then
        Account = instance.parameters.Account;
        Amount = instance.parameters.Amount;
        BaseSize = core.host:execute("getTradingProperty", "baseUnitSize", instance.bid:instrument(), Account);
        Offer = core.host:findTable("offers"):find("Instrument", instance.bid:instrument()).OfferID;
        CanClose = core.host:execute("getTradingProperty", "canCreateMarketClose", instance.bid:instrument(), Account);
        PipSize = instance.bid:pipSize();
        SetLimit = instance.parameters.SetLimit;
        Limit = instance.parameters.Limit;
        SetStop = instance.parameters.SetStop;
        Stop = instance.parameters.Stop;
        TrailingStop = instance.parameters.TrailingStop;
    end

    source = ExtSubscribe(2, nil, instance.parameters.TF, instance.parameters.Type == "Bid", "bar");
    clear = core.indicators:create("RB_CLEAR", source);

    ExtSetupSignal(name .. ":", ShowAlert);
    ExtSetupSignalMail(name);
end

function ExtUpdate(id, source, period)
    clear:update(core.UpdateLast);

    -- Check that we have enough data
    if (clear.DATA:first() > (period - 1)) then
        return
    end

    local pipSize = instance.bid:pipSize()

    local trades = core.host:findTable("trades");
    local haveTrades = (trades:find('AccountID', Account) ~= nil)
   
    local MustB=false;
    local MustS=false;

--        if clear.Up:hasData(period) and clear.Dn:hasData(period - 1) then
--            ExtSignal(instance.bid, instance.bid:size() - 1, "Swing Up", SoundFile, Email);
--        elseif clear.Dn:hasData(period) and clear.Up:hasData(period - 1) then
--            ExtSignal(instance.bid, instance.bid:size() - 1, "Swing Down", SoundFile, Email);
--        end

   
    if clear.Dn:hasData(period) and clear.Up:hasData(period - 1) then
--     if instance.parameters.TypeSignal=="direct" then
      MustS=true;
--     else
--      MustB=true;
--     end
    end

    if clear.Up:hasData(period) and clear.Dn:hasData(period - 1) then
--     if instance.parameters.TypeSignal=="direct" then
      MustB=true;
--     else
--      MustS=true;
--     end
    end
   
    if (haveTrades) then
        local enum = trades:enumerator();
        while true do
            local row = enum:next();
            if row == nil then break end

            if row.AccountID == Account and row.OfferID == Offer then
                    -- Close position if we have corresponding closing conditions.
                if row.BS == 'B' then
                    if MustS==true then
              if ShowAlert then
                if AllowDirection~="Long" then
                            ExtSignal(source, period, "Close BUY and SELL", SoundFile, Email, RecurrentSound);
                          else
             ExtSignal(source, period, "Close BUY", SoundFile, Email, RecurrentSound);
           end 
             end

              if AllowTrade then
                            Close(row);
                            if AllowDirection~="Long" then
                              Open("S")
                            end 
             end
                    end
                elseif row.BS == 'S' then
                    if MustB==true then
                  if ShowAlert then
                    if AllowDirection~="Short" then
                            ExtSignal(source, period, "Close SELL and BUY", SoundFile, Email, RecurrentSound);
                          else
             ExtSignal(source, period, "Close SELL", SoundFile, Email, RecurrentSound);
           end 
             end

                  if AllowTrade then
                            Close(row);
                            if AllowDirection~="Short" then
                              Open("B")
                            end 
             end
                    end
                end

            end
        end
  else
        if MustB==true then

            if ShowAlert and AllowDirection~="Short" then
                ExtSignal(source, period, "BUY", SoundFile, Email, RecurrentSound)
                if AllowTrade then
                  Open("B")
                end
            end
        end

        if MustS==true then
            if ShowAlert and AllowDirection~="Long" then
               ExtSignal(source, period, "SELL", SoundFile, Email, RecurrentSound)
               if AllowTrade then
                 Open("S")
               end
       end

        end
    end


end

-- The strategy instance finalization.
function ReleaseInstance()
end

-- The method enters to the market
function Open(side)
    local valuemap;

    valuemap = core.valuemap();
    valuemap.OrderType = "OM";
    valuemap.OfferID = Offer;
    valuemap.AcctID = Account;
    valuemap.Quantity = Amount * BaseSize;
    valuemap.CustomID = CID;
    valuemap.BuySell = side;
    valuemap.QTXT="1";
    if SetStop and CanClose then
        valuemap.PegTypeStop = "O";
        if side == "B" then
            valuemap.PegPriceOffsetPipsStop = -Stop;
        else
            valuemap.PegPriceOffsetPipsStop = Stop;
        end
        if TrailingStop then
            valuemap.TrailStepStop = 1;
        end;
    end
    if SetLimit and CanClose then
        valuemap.PegTypeLimit = "O";
        if side == "B" then
            valuemap.PegPriceOffsetPipsLimit = Limit;
        else
            valuemap.PegPriceOffsetPipsLimit = -Limit;
        end
    end
    success, msg = terminal:execute(200, valuemap);
    assert(success, msg);

    -- FIFO Account, in that case we have to open Net Limit and Stop Orders
    if not(CanClose) then
        if SetStop then
            valuemap = core.valuemap();
            valuemap.OrderType = "SE"
            valuemap.OfferID = Offer;
            valuemap.AcctID = Account;
            valuemap.NetQtyFlag = 'y';
            if side == "B" then
                valuemap.BuySell = "S";
                rate = instance.ask[NOW] - Stop * PipSize;
                valuemap.Rate = rate;
            elseif side == "S" then
                valuemap.BuySell = "B";
                rate = instance.bid[NOW] + Stop * PipSize;
                valuemap.Rate = rate;
            end
            if TrailingStop then
                valuemap.TrailUpdatePips = 1
            end
            success, msg = terminal:execute(200, valuemap);
            --core.host:trace('Set stop @ ' .. rate);
            assert(success, msg);
        end
        if SetLimit then
            valuemap = core.valuemap();
            valuemap.OrderType = "LE"
            valuemap.OfferID = Offer;
            valuemap.AcctID = Account;
            valuemap.NetQtyFlag = 'y';
            if side == "B" then
                valuemap.BuySell = "S";
                rate = instance.ask[NOW] + Limit * PipSize;
                valuemap.Rate = rate;
            elseif side == "S" then
                valuemap.BuySell = "B";
                rate = instance.bid[NOW] - Limit * PipSize;
                valuemap.Rate = rate;
            end
            success, msg = terminal:execute(200, valuemap);
            --core.host:trace('Set limit @ ' .. rate);
            assert(success, msg);
        end
    end
end

-- Closes specific position
function Close(trade)
    local valuemap;
    valuemap = core.valuemap();

    if CanClose then
        -- non-FIFO account, create a close market order
        valuemap.OrderType = "CM";
        valuemap.TradeID = trade.TradeID;
    else
        -- FIFO account, create an opposite market order
        valuemap.OrderType = "OM";
    end

    valuemap.OfferID = trade.OfferID;
    valuemap.AcctID = trade.AccountID;
    valuemap.Quantity = trade.Lot;
    valuemap.CustomID = trade.QTXT;
    if trade.BS == "B" then valuemap.BuySell = "S"; else valuemap.BuySell = "B"; end
    success, msg = terminal:execute(200, valuemap);
    assert(success, msg);
end

function AsyncOperationFinished(cookie, successful, message)
  if not successful then
    core.host:trace('Error: ' .. message)
  end
end


dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");



The Strategy was revised and updated on December 09, 2018.
sunshine
 

Re: Ron Black's 'Getting Clear With Short-Term Swings'

Postby BabyBull » Wed Sep 19, 2012 10:12 am

Nice work on this strategy, is there a way to lime time frames and possibly optimize them. Interested in trading just the London/NY overlap or maybe the London open.
Thank you for all your hard work.
BabyBull
 
Posts: 10
Joined: Fri Jul 20, 2012 9:30 am

Re: Ron Black's 'Getting Clear With Short-Term Swings'

Postby Apprentice » Thu Sep 20, 2012 1:01 am

Your request is added to the development list.
User avatar
Apprentice
FXCodeBase: Confirmed User
 
Posts: 36435
Joined: Thu Dec 31, 2009 11:59 am
Location: Zagreb, Croatia

Re: Ron Black's 'Getting Clear With Short-Term Swings'

Postby BabyBull » Thu Sep 20, 2012 11:04 am

Thank you, I have this strategy loaded and active on 4 pairs (EURUSD, GBPUSD, USDCHF, USDCAD and the USdollar). Last night I paused the strategies and this morning I unpaused them. Only one pair (USDCHF) had trades executed. All settings are the same with the exception of the pair in the drop down menu. A couple of question, how does the trailing stop work. It is either on or off. What are the parameters? Is it fixed and if so how many pips or is it dynamic? Also, with trading time parameters will the strategy allow an open trade to continue with out opening a new position or will it close all positions at the stop time, say 11:30 EST?
Thank you again for your assistance.
Attachments
Strategy Input Screen Shots.docx
(169.27 KiB) Downloaded 806 times
BabyBull
 
Posts: 10
Joined: Fri Jul 20, 2012 9:30 am



Return to Custom Strategies

Who is online

Users browsing this forum: No registered users and 20 guests