//@Name:Alarm:intraHLMid X MA/ENV //@Description:An alarm that triggers when either the High/Low or Close crosses a specified MA. //@Env:Production //@Update:Periodic, 15 //@Returns:Text //@Width:120 // Care has been taken in preparing this code but it is provided without guarantee. // You are welcome to modify and extend it. Please add your name as a modifier if you distribute it. //Coded by: Phil Tolhurst, ShareScript Support var period = 25; var barSize = 2; var MAType = 1; var MAList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA"]; var MAreturnList = ["SMA","EMA","WME","TME","VarVHF","VarCMO","VIDYA"]; var dataType = 0; var dataSource = ["High/Low","Mid"]; var envelope = 1 var envelopeChoice = ["MA","Envelope"] var envPercent = 2.0 function init(status) { if (status == Loading || status == Editing) { period = storage.getAt(0); MAType = storage.getAt(1); dataType = storage.getAt(2); envelope = storage.getAt(3); envPercent = storage.getAt(4); barSize = storage.getAt(5); } if (status == Adding || status == Editing) { dlg = new Dialog("Intraday price crossing MA", 295, 70); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("VAL1", 50, 5,-1, -1, "MA Period","", period, 1, 5000); dlg.addDropList("VAL2",120,5,-1,-1, MAList, "MA Type","",MAType); dlg.addDropList("VAL3", 50,22,-1,-1,dataSource,"Check for the","",dataType); dlg.addDropList("VAL4", 160,22,-1,-1,envelopeChoice,"crossing the","",envelope); dlg.addNumEdit("VAL5", 50,39,-1, -1, "Envelope","%", envPercent, 0.1, 50); dlg.addNumEdit("VAL6", 50,56,-1, -1, "Bar Size:","minutes", barSize, 1, 300); if (dlg.show()==Dialog.Cancel) return false; period= dlg.getValue("VAL1"); MAType = dlg.getValue("VAL2"); dataType =dlg.getValue("VAL3"); envelope = dlg.getValue("VAL4"); envPercent = dlg.getValue("VAL5"); barSize = dlg.getValue("VAL6"); storage.setAt(0, period); storage.setAt(1, MAType); storage.setAt(2,dataType); storage.setAt(3,envelope); storage.setAt(4,envPercent); storage.setAt(5,barSize); } } function getVal(share) { //Get data array and add intraday data as the last Open,High,Low,Close and Volume figures in the aray var data = share.getIBarArray(0,(barSize*60)); if (data==undefined || data.length (envelope==1?MAres[t]*(1+(envPercent/100)):MAres[t])) { setValueForShare(share, 1); return dataType==0?"High Crossed Above "+(envelope==0?period+MAreturnList[MAType]:envPercent.toFixed(2)+"% envelope on a "+period+MAreturnList[MAType]):"Mid Crossed Above "+(envelope==0?period+MAreturnList[MAType]:envPercent.toFixed(2)+"% envelope on a "+period+MAreturnList[MAType]); } else if (getValueForShare(share)!=-1 && (dataType==0?data[y].low:data[y].close)>(envelope==1?MAres[y]*(1-envPercent/100):MAres[y]) && (dataType==0?data[t].low:data[t].close)<(envelope==1?MAres[t]*(1-envPercent/100):MAres[t])) { setValueForShare(share, -1); return dataType==0?"Low Crossed Below "+(envelope==0?period+MAreturnList[MAType]:envPercent.toFixed(2)+"% envelope on a "+period+MAreturnList[MAType]):"Mid Crossed Below "+(envelope==0?period+MAreturnList[MAType]:envPercent.toFixed(2)+"% envelope on a "+period+MAreturnList[MAType]); } //Reset Trigger if (getValueForShare(share)==1 && (dataType==0?data[t].high:data[t].close)<(envelope==1?MAres[t]*(1+envPercent):MAres[t])) { setValueForShare(share, 0); } else if (getValueForShare(share)==-1 && (dataType==0?data[t].high:data[t].close)>(envelope==1?MAres[t]*(1-envPercent):MAres[t])) { setValueForShare(share, 0); } }