如何编码? - 页 291

 

最后一个蜡烛的细节

你好。

需要一个指标来显示最后一根蜡烛的高点、低点、开盘和收盘值...

 
mladen:
那为什么不使用跟踪止损呢?我的意思是,它几乎可以做到你原来想法的100%(几乎),而且它的代码要容易得多。

问题是(我不认为我的措辞是正确的,或者说不是100%正确的),止损点(无论如何现在)在整个交易过程中都将保持不变。这样的方法如何,当两笔交易打开时,代码可以检查未结订单的数量,如果它高于1(基本上是2),那么这两笔交易的止损 就会被修改为比以前高的某个数额。从本质上讲,这里有某种对冲作用。

谢谢。

madmax3

 

[langtitle=pl]Proszę o pomoc w napisaniu EA działającego n[/langtitle] 。

[lang=pl]我想说的是,我们的问题是,为什么要把我们的问题归结为一个问题呢?

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"

#property link "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

外部int MagicNumber = 0;

extern bool SignalMail = False;

外部 bool EachTickMode = True;

外置双数 Lots = 0.1;

extern int Slippage = 1;

外部 bool UseStopLoss = True;

外置 int StopLoss = 10;

外部 bool UseTakeProfit = True;

外置 int TakeProfit = 5;

外部 bool UseTrailingStop = False;

extern int TrailingStop = 30;

extern int LevelRSIbuy=20;

extern int LevelRSIsell=80;

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| 专家初始化函数 |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

如果(EachTickMode)Current = 0;否则Current = 1。

return(0);

}

//+------------------------------------------------------------------+

//| 专家去初始化功能|

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| 专家启动功能|

//+------------------------------------------------------------------+

int start() {

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

如果(EachTickMode && Bars != BarCount) TickCheck = False;

Total = OrdersTotal();

订单 = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| 变量开始 |

//+------------------------------------------------------------------+

double Var1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);

double Buy1_1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);

double Sell1_1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);

//+------------------------------------------------------------------+

//|变量结束 |

//+------------------------------------------------------------------+

//检查头寸

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)。

如果(OrderType() <= OP_SELL && OrderSymbol() == Symbol() ) {

IsTrade = True。

如果(OrderType() == OP_BUY){

//关闭

//+------------------------------------------------------------------+

//| 信号开始(退出买入)|

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| 信号结束(退出买入)|

//+------------------------------------------------------------------+

如果(Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))){

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen)。

if (SignalMail) SendMail("[信号提示]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

继续。

}

//拖曳止损

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

如果(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen) 。

if (!EachTickMode) BarCount = Bars;

继续。

}

}

}

} else {

//关闭

//+------------------------------------------------------------------+

//| 信号开始(退出卖出)|

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| 信号结束(退出卖出)|

//+------------------------------------------------------------------+

如果(Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))){

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange)。

如果(SignalMail) SendMail("[信号警报]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False。

继续。

}

//拖曳止损

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

如果((OrderStopLoss() > (Ask + Point * TrailingStop))|| (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange) 。

if (!EachTickMode) BarCount = Bars;

继续。

}

}

}

}

}

}

//+------------------------------------------------------------------+

//| Signal Begin(Entry) |

//+------------------------------------------------------------------+

if (False) Order = SIGNAL_BUY;

如果 (False) 订单 = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| 信号结束 |

//+------------------------------------------------------------------+

//买入

如果(Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (! EachTickMode && (Bars != BarCount))))){

if(!IsTrade) {

//检查自由保证金

如果(AccountFreeMargin() < (1000 * Lots)) {

Print("我们没有钱。Free Margin = ", AccountFreeMargin())。

return(0);

}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue) 。

如果(Ticket > 0) {

如果(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("BUY订单打开:", OrderOpenPrice())。

if (SignalMail) SendMail("[信号提示]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

Print("打开买入订单出错。", GetLastError())。

}

}

if (EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

}

//卖出

如果(Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))){

if(!IsTrade) {

//检查自由保证金

如果(AccountFreeMargin() < (1000 * Lots)) {

Print("我们没有钱。Free Margin = ", AccountFreeMargin())。

return(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0。

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink) 。

如果(Ticket > 0) {

如果(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("Sell order opened : " , OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell")。

} else {

Print("错误打开卖出订单。", GetLastError())。

}

}

if (EachTickMode) TickCheck = True;

如果(!EachTickMode) BarCount = Bars;

return(0);

}

}

如果(!EachTickMode) BarCount = Bars;

return(0);

}

//+------------------------------------------------------------------+[/lang]

 

我想用这段代码来增加未平仓交易的获利(如果他们有两个未平仓交易)。

if(total>2)

if(OrderType()==OP_BUY)

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);

if(OrderType()==OP_SELL)

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);

total=OrdersTotal(); btw.

但我还是不能让它工作,有什么建议吗?

谢谢。

madmax3

 

帮助限制每日交易的数量为1

我是编程新手,在MQL4中需要帮助。我已经研究了一些编码指南,并且知道了如何根据我的交易策略打开和关闭交易。我的困难是把每天的交易数量限制在1个。我希望每天的交易不超过1个(根据服务器时间)。所以我想检查 开仓和平仓的订单,看看今天是否有订单被打开。如果今天有订单被打开,那么当天就不要再打开任何其他订单。

请帮助。

 
试试这样的方法。
bool uniqueOnDay()

{

datetime startTime = iTime(NULL,PERIOD_D1,Time[0]);

datetime endTime = startTime+24*60*PERIOD_D1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}
它是在检查当前符号的任何已关闭的订单是否在当天被打开。如果当日有订单被打开,则返回false(当日已经有订单被打开),否则返回true(当日没有订单被打开)。它不检查当前打开的订单(只检查历史记录),因为我认为你不希望有超过1个打开的订单,而这是不同的检查方式。用法是这样的。

如果(UniqueOnDay() && CurrentlyOpenedOrders==0) ...

PS:它假定你的EA有一个MagicNumber参数(确切名称)。

PPS:它可以在Daiy以内的时间框架上工作。它在周线和月线图上无法正常工作。

dresolo1:
我是编程新手,在MQL4方面需要帮助。我研究了一些程序员指南,并想出了如何根据我的交易策略来打开和关闭交易。我的困难是把每天的交易数量限制在1个。我希望每天的交易不超过1个(根据服务器时间)。所以我想检查开仓和平仓的订单,看看今天是否有订单被打开。如果今天有一个订单被打开,那么当天就不要再打开任何其他订单。请帮助我。
 

[langtitle=pl]将函数 Tema转换成Tema(close,period)[/langtitle]

术语

我想说的是:"如果你是一个人,那么你就应该把它变成一个人。你可以将函数Tema转换为Var1。如果你想在Var1中加入一个 "Ponizej",那么你就得先把这个 "Ponizej "的名字改掉。

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 DarkBlue

#property indicator_width1 2

//---- input parameters

extern int EMA_period=4;

//---- buffers

string txt;

double TemaBuffer[];

double Ema[];

double EmaOfEma[];

double EmaOfEmaOfEma[];

double Var1;

int Var2;

int i,limit,limit2,limit3;

extern int Apply_To_Price=1;

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- indicators

IndicatorBuffers(5);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Var1);

SetIndexBuffer(1,TemaBuffer);

SetIndexBuffer(2,Ema);

SetIndexBuffer(3,EmaOfEma);

SetIndexBuffer(4,EmaOfEmaOfEma);

IndicatorShortName("TEMA("+EMA_period+")");

switch(Apply_To_Price)

{

case 1:

{txt="Open";break;}

case 2:

{txt="High";break;}

case 3:

{txt="Low"; break;}

case 4:

{txt="Median"; break;}

case 5:

{txt="Typical"; break;}

case 6:

{txt="WghtdClose"; break;}

default:

{txt="Close";}

}

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

//----

int counted_bars=IndicatorCounted();

if (counted_bars==0)

{

limit=Bars-1;

limit2=limit-EMA_period;

limit3=limit2-EMA_period;

}

if (counted_bars>0)

{

limit=Bars-counted_bars-1;

limit2=limit;

limit3=limit2;

}

for (i=limit3;i>=0;i--)

{

Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?

// Alert(Var1);

}

Var2 = dodawanie (2,3);

return(0);

}

double Tema(int Cena, int cykl)

{

//----

for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);

for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--)

{

TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEmaOfEma;

//Alert(TemaBuffer);

}

return(TemaBuffer);

}

int dodawanie (int a, int b)

{

int c;

c=a+b;

return(c);

}

 

像这样(TEMA)...

如果你希望它像函数 一样,那么它应该是这样的。
double workTema[][3];

#define _ema1 0

#define _ema2 1

#define _ema3 2

double iTema(double price, double period, int r, int instanceNo=0)

{

if (ArrayRange(workTema,0)!= Bars) ArrayResize(workTema,Bars); instanceNo*=3; r = Bars-r-1;

//

//

//

//

//

double alpha = 2.0 / (1.0+period);

workTema[r][_ema1+instanceNo] = workTema[r-1][_ema1+instanceNo]+alpha*(price -workTema[r-1][_ema1+instanceNo]);

workTema[r][_ema2+instanceNo] = workTema[r-1][_ema2+instanceNo]+alpha*(workTema[r][_ema1+instanceNo]-workTema[r-1][_ema2+instanceNo]);

workTema[r][_ema3+instanceNo] = workTema[r-1][_ema3+instanceNo]+alpha*(workTema[r][_ema2+instanceNo]-workTema[r-1][_ema3+instanceNo]);

return(workTema[r][_ema3+instanceNo]+3.0*(workTema[r][_ema1+instanceNo]-workTema[r][_ema2+instanceNo]));

}[/PHP]

也附上一个指标的例子。传递一个值而不是价格类型的好处是,这样你可以将tema应用于任何值(它不一定是价格的tema,它可以是另一个指标的tema,例如)。

lukibest:
巫师

Jeszcze raz bo cos sie zle wkleilo.你可以在Var1的Funkcji Tema中选择一个。如果你想让Var1有更大的发展空间,你就必须要有更多的时间。

[PHP]

#属性 indicator_chart_window

#属性 indicator_buffers 1

#属性 indicator_color1 DarkBlue

#属性 indicator_width1 2

//---- 输入参数

extern int EMA_period=4;

//---- 缓冲区

string txt;

double TemaBuffer[]。

double Ema[];

double EmaOfEma[];

double EmaOfEmaOfEma[]。

双重Var1。

int Var2;

int i,limit,limit2,limit3;

extern int Apply_To_Price=1;

//+------------------------------------------------------------------+

//|自定义指标初始化函数|

//+------------------------------------------------------------------+

int init()

{

//---- 指标

IndicatorBuffers(5);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Var1);

SetIndexBuffer(1,TemaBuffer);

SetIndexBuffer(2,Ema);

SetIndexBuffer(3,EmaOfEma);

SetIndexBuffer(4,EmaOfEmaOfEma)。

IndicatorShortName("TEMA("+EMA_period+")")。

switch(Apply_To_Price)

{

case 1:

{txt="Open";break;}

case 2:

{txt="高点";break;}

case 3:

{txt="低点";break;}

case 4:

{txt="中位数";break;}

case 5:

{txt="典型"; break;}

case 6:

{txt="WghtdClose"; break;}

默认情况下。

{txt="关闭";}

}

//----

return(0);

}

//+------------------------------------------------------------------+

//| 自定义指标的去初始化功能。

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//|自定义指标迭代函数|

//+------------------------------------------------------------------+

int start()

{

//----

int counted_bars=IndicatorCounted()。

如果(counted_bars==0)

{

limit=Bars-1;

limit2=limit-EMA_period;

limit3=limit2-EMA_period。

}

如果(counted_bars>0)

{

limit=Bars-counted_bars-1;

limit2=limit;

limit3=limit2;

}

for (i=limit3;i>=0;i--)

{

Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA.DLACZEGO?

// Alert(Var1);

}

Var2 = dodawanie (2,3);

return(0);

}

double Tema(int Cena, int cykl)

{

//----

for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i) 。

for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i)。

for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--)

{

TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEma。

//Alert(TemaBuffer)。

}

return(TemaBuffer)。

}

int dodawanie (int a, int b)

{

int c;

c=a+b。

返回(c)。

}

附加的文件:
tema.mq4  3 kb
 

请帮助解决HAMMER代码问题

你好。

我刚刚开始使用mql4。 试图用以下指标在蜡烛图中挑选黑白锤子。 但是,在图表中,有时蜡烛图会出现错误的识别文本(白色锤子蜡烛被识别为黑色锤子蜡烛,反之亦然)。 请帮助我解决这种情况,提前感谢。

#property indicator_chart_window

int limit。

//---- 缓冲区

string hammer[200000];

//+------------------------------------------------------------------+

//|CuStom指标 初始化函数|

//+------------------------------------------------------------------+

int init()

{

返回(0)。

}

//+------------------------------------------------------------------+

//| CuStor指标去初始化功能

//+------------------------------------------------------------------+

int deinit()

{

//----

ObjectsDeleteAll(hammer,OBJ_TEXT)。

//----

return(0);

}

//+------------------------------------------------------------------+

//|CuStom指标迭代函数|

//+------------------------------------------------------------------+

int start()

{

int N。

int N1;

int N2;

字符串文本。

int counted_bars=IndicatorCounted();

limit=Bars-counted_bars。

for(N = 1; N < limit; N++) {

hammer[N]=CharToStr(N)。

N1 = N + 1;

N2 = N + 2;

//----

//----,检查可能的错误

如果(counted_bars<0) {

Alert("NO Bars.")。

return(-1);

}

// 检查锤子白的情况

如果(((Close[N1]>Open[N1])&((Open[N1]-Low[N1])>=2*(Close[N1]-Open[N1]))&((High[N1]-Close[N1])<=(Open[N1)-Low[N1])*0.10)){

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "WHmr", 9, "Times New Roman", LawnGreen)。

}

// 检查锤子是否为黑色

if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))){

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "BHmr", 9, "Times New Roman", LawnGreen)。

}

//----

}//结束for循环

return(0);

}

//+------------------------------------------------------------------+

 
svezir:
你好。

我是在mql4中新开始的。 试图用以下指标在蜡烛图中挑选黑白锤子。 但是,在图表中,有时蜡烛图会出现错误的识别文本(白色锤子蜡烛被识别为黑色锤子蜡烛,反之亦然)。 请帮助我解决这种情况,提前感谢。

#property indicator_chart_window

int limit。

//---- 缓冲区

string hammer[200000];

//+------------------------------------------------------------------+

//|CuStom指标初始化函数|

//+------------------------------------------------------------------+

int init()

{

返回(0)。

}

//+------------------------------------------------------------------+

//| CuStor指标去初始化功能

//+------------------------------------------------------------------+

int deinit()

{

//----

ObjectsDeleteAll(hammer,OBJ_TEXT)。

//----

return(0);

}

//+------------------------------------------------------------------+

//|CuStom指标迭代函数|

//+------------------------------------------------------------------+

int start()

{

int N。

int N1;

int N2;

字符串文本。

int counted_bars=IndicatorCounted();

limit=Bars-counted_bars。

for(N = 1; N < limit; N++) {

hammer[N]=CharToStr(N)。

N1 = N + 1;

N2 = N + 2;

//----

//----,检查可能的错误

如果(counted_bars<0) {

Alert("NO Bars.")。

return(-1);

}

// 检查锤子白的情况

如果(((Close[N1]>Open[N1])&((Open[N1]-Low[N1])>=2*(Close[N1]-Open[N1]))&((High[N1]-Close[N1])<=(Open[N1)-Low[N1])*0.10)){

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "WHmr", 9, "Times New Roman", LawnGreen)。

}

// 检查锤子是否为黑色

if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))){

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "BHmr", 9, "Times New Roman", LawnGreen)。

}

//----

}//结束for循环

return(0);

}

//+------------------------------------------------------------------+

嗨,Svezir。

有这个蜡烛形态的指标,也许会有帮助。

附加的文件: