MQL4:金字塔战略顾问

你好,亲爱的外汇程序员们!

今天的MQL4课程将致力于创建一个贸易专家,在其中实现金字塔的建设待处理订单以及随后的护送。首先,让我们看看什么是金字塔战略,它有多有效,以及它隐藏着什么陷阱。然后我们继续写一个以金字塔为基础的顾问。

金字塔:基本概念

必须立即指出金字塔不是独立的。贸易体系更恰当的说法是增加法。利润贸易趋势.金字塔化的主要思想是所谓的“填充物”,当存在明显的趋势新开放项目滚动或者在下一次合并时同时,总增长体积因此,并且利润这种行为的模式类似于阶梯金字塔,因此得名——“金字塔”。

在上图中,我们可以看到金字塔的工作原理。8个未平仓的商品趋势最终,一切都关闭了。Stop Loss:最后一笔交易亏损,倒数第二位-B收支平衡剩下的六个都是利润。可能会出现这样的问题:第一个位置是否可以立即打开。测深关闭拖车停止? 事实上,我们不知道价格是否会朝着我们想要的方向发展,在这种情况下,我们会冒着全部风险。金字塔允许逐渐增加总成交量,因为下一个头寸只有在上一个头寸盈利后才会打开。

有人认为,金字塔是识字和相对安全的唯一方法超额存款在几天的成功趋势中,将存款翻一番——翻三番——是可行的,但风险仅为可用资金的2%。

入口点

如前所述,金字塔化是一种增加趋势交易利润的方法。显然这种方法不适合波段(浮动)交易,可能导致完全损失存款所以在建造金字塔之前交易者确定趋势的开始很重要。我们将把这项任务排除在今天的教训之外。值得注意的是,寻找这样的入口点是最好的。时间范围H1及以上

在第一次发生之后交易当我们确信价格朝着正确的方向发展时,另一个问题出现了:在什么地方应该重新进入?最明显的方法是在主信号下输入,但在较小的信号上输入。时间范围触摸时可以倒水移动平均进或出振荡器进出超买或超卖区域,当出现蜡烛模型继续趋势时,在更大的范围内体积巩固的突破,穿孔测试强者水平但你可以做得更容易,进入新的交易固定步长项目这一步骤可以根据所选择的战术扩大或缩小。我们将在我们的贸易专家中使用这种纯粹的数学方法来构建金字塔。

扩大阵地范围

增加总容量的最保守和最常见的方法是以固定的方式打开每个新头寸。测深.

如果有一个强大的稳定趋势,可以使用更具侵略性的方法,当每个新头寸的数量大于上一个头寸的数量时。例如,1;2; 3; 4或1;2; 4; 8; 16.在这种情况下,重要的是要及时固定利润,否则如果最后一个头寸被平仓。Stop Loss由此产生的损失可能会抵消以前积累的全部利润。

也有一种方法与前一种方法相反,即每个新位置的体积小于前一个位置。例如,4;3; 2; 1.这种方法是合理的,因为每一个趋势都有衰减的趋势,随着金字塔的每一个新台阶,逆转或大幅回落的可能性会增加。最后一批亏损较低测深将被第一批利润所抵消。这种方法的缺点是可能的利润损失,尽管风险当然,他们会变得更低。在我们未来的顾问中,我们将采用这两种方法。

利润固定

在经典金字塔的情况下,使用通用的利润固定Stop Loss换言之,在新的立场上Stop Loss所有现有头寸均转入最后一个未结余额。我们将在创建顾问时使用这种机制,稍后将详细讨论。

另一种常见的方法是在达到一定利润水平时关闭金字塔。在这种情况下交易者它决定了足够的利润来关闭金字塔。

最后,关闭金字塔的决定可以根据技术分析在当前趋势逆转或减弱的早期迹象。

一般顾问算法

让我们开始建立一个贸易专家。正如“百闻不如一见”这句格言所言,让我们看看真实的世界是怎样的。图表这可能是一个金字塔的待审订单,我们的顾问将建立。

在这里,我们看到一个金字塔出售出售停止订单。每个后续的体积订单它以0.01步的算术级数增长。

当价格向下移动时,前四个卖出止损订单被激活时,金字塔看起来就是这样。现在我们有四个市场订单和六个延期订单。我们只需要平仓时的一般止损。但后来。

可以使用以下流程图大致记录顾问算法:

我们将确定未来顾问的全部功能,并描述其输入参数。

Money Management

此部分包含与资本管理:

Lots–固定/启动批量;

LotsMultMode–每个新金字塔位置的增减模式,可以接受三个值之一:禁用(所有位置的体积将相同,等于lots参数);算术(体积在算术级数中增加);几何(体积将以几何级数增加);

LotsMultiplicatorAr–算术级数差,每个新批次都增加该值;如果参数为0(0),则级数的差分是系列中第一个订单的批量。使用此参数的负值,可以减少批量;

LotsMultiplicatorGm–几何级数的分母,每个新批量都会增加指定的次数。如果值小于1,则批量将减少。例如,在1.5时,每个新的批量将增加1.5倍。为了使批量减少一半,需要1/1.5=0.67。

信号

如前所述,为了成功的贸易,我们需要尽可能靠近趋势运动的可能开始建造金字塔。我们使用以下方案:从待定订单中构建金字塔随机进入超买区(金字塔出售)或超卖区(金字塔购买)。如果使用经典的信号不是输入而是输出线路随机从超买/超卖区域来看,由于指示灯延迟,虚假输入将大大增加。我们正在努力向前迈进。如果价格没有转向我们,我们只需要删除金字塔(所有待售订单)并等待新的信号。

StochasticPeriod随机期;

StochasticSlowing-减速;

StochasticLevelDn–超卖/超买自动(例如,对于StochaSticleVeldn=20,上限为100–StochaSticleVeldn=80)。

一般交易参数

DistanceToGrid–收到随机信号后,网格与价格的距离;

AfterSignaBarsCount–等待网格激活的酒吧数量。由于我们在随机进入超买或超卖区域时构建网格,因此我们只能假设可能不会发生的逆转。因此,如果金字塔没有激活,它必须在一段时间后移除。使用此选项,可以在当前时间范围的栏中指定此检查期。很明显,当反向信号到达时,金字塔也会被移除。如果参数AfterSignaBarsCount如果为零,则只有在反向信号形成后才能删除金字塔;

Magic–魔法号码,顾问打开的订单ID;

Slippage最大允许滑动.

网格设置

在我们的顾问中,金字塔将被构建为一个待售订单网格,该网格是在一定距离内设置的买入止损或卖出止损订单。这种延期订单在价格走势方向上激活,这意味着它们适合趋势交易。此部分设置订单和整个网格的设置。

OrdersAmount–网格中待处理订单的数量;

GridStep–网格间距,即挂起的网格订单之间的距离。这个距离可以是固定的,也可以是递减的,这取决于参数。StepMultMode在动态步骤的情况下,指定其初始值;

StepMultMode–当订单远离入口点时,网格中订单之间的扩展/减少距离模式。与位置体积相似的步长可以在算术或几何级数中变化;

StepMultiplicatorAr–算术级数的差,每个订单将与上一个订单的距离相同,后者将增加该值;如果参数为零,则进度差为参数值GridStep参数的负值将步数减少到该值;

StepMultiplicatorGm–几何级数的分母,步长增加指定的次数。如果值小于1,则步骤将减小。例如,在1.5时,步骤将增加1.5倍。若要将步长减半,则需要1/1.5=0.67;

StopLossRatio停止失去一步。经典金字塔的构造方式是,下一个订单的止损等于上一个订单的开仓价格。但是,您可以使用此参数将止损大小与步数关联。

TakeProfit–一般利润为了固定利润,我们的顾问使用一般的止损,但可能会激活所有金字塔订单,价格将继续趋势。为了避免在这种罕见的情况下损失利润,我们使用了Take Profit保险,否则我们将不得不等待价格的回归和总的止损。不过,最好还是在金字塔里使用更多的订单。

顾问的职能

让我们从上面的流程图开始算法的实现。这个方案(块)的每个元素都可以作为函数执行。“新柚木”块对应于处理程序OnTick()在其中,我们将调用其他功能。

功能RefreshState()

让我们从一个函数开始,这个函数在我们的方案中没有单独的块表示,因为它属于服务类别,但值得特别注意。功能RefreshState()收集有关顾问打开的订单的信息并将其放入提交的状态结构:

//顾问发出的订单的存储结构struct state{double            BuyTopPrice;         // 最高订单开仓价格double            SellBottomPrice;     // 开仓价格最低double            BuyTopSL;            // 最高订单100%买入double            BuyBottomSL;         // 买入最低订单double            SellTopSL;           // 最高卖出订单double            SellBottomSL;        // 卖出最低订单datetime          BuyStopStart;        // 金字塔安装时间(打开网格中第一个买入停止订单)datetime          SellStopStart;       // 安装金字塔的时间(打开网格中第一个卖出停止订单)int               BuyCount;            // 订单数量Buyint               SellCount;           // 订单数量sellint               BuyStopCount;        // 订单数量Buy Stopint               SellStopCount;       // 订单数量Sell Stop};

基于收集的功能RefreshState()统计数据,顾问跟踪当前形势贸易账户并确定算法的确切步骤。

例如,下面的代码确定所有金字塔市场订单都以止损方式关闭,现在需要删除不起作用的延迟订单:

//订单网格在总止损处关闭,删除剩余余额if((State.BuyStopCount>0 && State.BuyStopCount<OrdersAmount && State.BuyCount==0) ||(State.SellStopCount>0 && State.SellStopCount<OrdersAmount && State.SellCount==0)){//删除待处理订单DeletePendingOrders();}

在这里,我们首先检查是否有任何延期订单;如果有,我们将检查它们的数量是否小于原始值,也就是说,从网格构建的那一刻起,它们中的一些就起作用了。现在,如果没有公开的市场订单,我们可以得出结论,它们是以止损收盘的。因此,剩余的待处理订单是无效的,必须删除。

在代码的以下部分中,只有在没有市场订单或延迟订单的情况下,我们才决定构建新网格:

//如果形成了新的条形图,请使用getSignal()查询指示器//并将结果写入tradesignal变量int TradeSignal=GetSignal();//新酒吧开张时没有延期订单或市场订单if(State.BuyCount==0 && State.SellCount==0 && State.BuyStopCount==0 && State.SellStopCount==0){//如果形成了交易信号,我们将构建一个给定类型的金字塔if(TradeSignal!=EMPTY)BuildPyramid(TradeSignal);//退出,因为进一步处理没有意义,因为要么根本没有搜查令,要么我们刚刚建造了一座金字塔。return;}

使用有关打开订单的信息,您还可以设计更复杂的条件。下一个代码将删除网格,如果自创建以来形成了更多的网格AfterSignaBarsCount酒吧或形成相反的信号:

//如果自网格创建以来形成了更多的Aftersignabarscount条,//或形成相反的信号,删除网格if((State.BuyStopCount>0 && State.BuyCount==0 &&((AfterSignaBarsCount>0 && State.BuyStopStart>0 && iTime(_Symbol,_Period,0)-State.BuyStopStart>=BarsInSeconds) || TradeSignal==OP_SELL))||(State.SellStopStart>0 && State.SellCount==0 &&((AfterSignaBarsCount>0 && State.SellStopStart>0 && iTime(_Symbol,_Period,0)-State.SellStopStart>=BarsInSeconds) || TradeSignal==OP_BUY))){//删除待处理订单DeletePendingOrders();return;}

功能GetSignal()

此函数轮询指示器并返回:OP_BUY(0–买入信号),如果随机进入超卖区域(从上到下穿过较低的信号水平);OP_SELL(1)当随机进入超买区(从下到上穿过顶部信号电平)时,销售信号。如果信号未形成,函数将返回EMPTY(-1):

//+------------------------------------------------------------------+函数返回:?//opu buy(买入信号),如果随机进入区域→//超卖(跨越较低信号水平)。(从上到下)/–OPu SELL(待售信号),如果随机进入区域›超买(跨越信号层)(自下而上)没有空信号。//+------------------------------------------------------------------+int GetSignal(){//在索引为1的酒吧中获得随机值double StochasticOnFirstBar=iStochastic(_Symbol,_Period,StochasticPeriod,1,StochasticSlowing,MODE_SMA,0,MODE_MAIN,1);//随机从上到下穿过较低的信号电平if(StochasticOnFirstBar<StochasticLevelDn){//为了节省资源,我们只在索引为2的酒吧获得随机值如何确定第一部分条件得到满足if(iStochastic(_Symbol,_Period,StochasticPeriod,1,StochasticSlowing,MODE_SMA,0,MODE_MAIN,2)>StochasticLevelDn)return(OP_BUY);}//随机从下到上穿过顶部信号电平if(StochasticOnFirstBar>100-StochasticLevelDn){//为了节省资源,我们只在索引为2的酒吧获得随机值如何确定第一部分条件得到满足if(iStochastic(_Symbol,_Period,StochasticPeriod,1,StochasticSlowing,MODE_SMA,0,MODE_MAIN,2)<100-StochasticLevelDn)return(OP_SELL);}在任何情况下,返回emptyreturn(EMPTY);}

功能BuildPyramid()

如果发送到该函数的信号参数等于“买入停止”参数,则此函数将构建一个挂起订单金字塔。OP_BUY,如果信号值为0,则传销停止传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销传销OP_SELL.

网格的构建距离等于买入止损订单的DISTANCETOGRID输入参数与卖出止损网格的要约值。如果此值小于最小允许值,则在给定字符的卖出停止距离上构建网格。

如果假设每个新订单的批数或从上一个订单发出的步数递增变化,则会调用服务功能。GetProgressionMember()此函数返回算术或几何级数的第n项。

//+------------------------------------------------------------------+//–从待办订单中构建金字塔›//如果signal参数等于opu buy,则buy stop。//如果signal参数等于opu sell,则sell stop//距离当前价格的距离›//+------------------------------------------------------------------+void BuildPyramid(int signal){设定正确的Stop Level值int StopLevel=GetTrueStopLevel();//如果建造金字塔的距离小于停止水平,//将其设置为stop levelint Distance=(DistanceToGrid<StopLevel)?StopLevel:DistanceToGrid;int Com;//待处理订单类型//在安装网格之前检查批量是否正确if((Lots<SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)) ||(Lots>SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))){打印(“起始交易量值不正确,金字塔将无法建造”)。return;}if(LotsMultMode>mlNone){double LastOrderLots=NormalizeDouble(GetProgressionMember(LotsMultMode,OrdersAmount-1,((LotsMultMode==mlArithmetical)?LotsMultiplicatorAr:LotsMultiplicatorGm),Lots),2);if((LastOrderLots<SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)) ||(LastOrderLots>SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))){打印(“检测到不正确的交易量值,不会建造金字塔”)。return;}}//在发布最后一个金字塔订单之前检查步骤是否正确if((GridStep<StopLevel)  ||(StepMultMode>mlNone &&(int)GetProgressionMember(StepMultMode,OrdersAmount-1,((StepMultMode==mlArithmetical)?StepMultiplicatorAr:StepMultiplicatorGm),GridStep)<StopLevel)){打印(“发现不正确的步骤值,金字塔将无法建造”)。return;}让我们看看停止损失的正确性。if((int(StopLossRatio*GridStep)<StopLevel) ||(StepMultMode>mlNone &&int(StopLossRatio*GetProgressionMember(StepMultMode,OrdersAmount-1,((StepMultMode==mlArithmetical)?StepMultiplicatorAr:StepMultiplicatorGm),GridStep))<StopLevel)){打印(“停止丢失值不正确,金字塔将无法建造”)。return;}检查是否正确Take Profitif(TakeProfit>0 && TakeProfit<StopLevel){print(“一般获利”,takeprofit,“小于最小允许值”,stoplevel,“金字塔不会建造”);return;}double Price, Sign, Step=GridStep;MqlTick tick;if(!SymbolInfoTick(_Symbol,tick))return;//确定起始价格和待售订单类型if(signal==OP_BUY){Price=tick.ask;Sign=1.0;Com=OP_BUYSTOP;}elseif(signal==OP_SELL){Price=tick.bid;Sign=-1.0;Com=OP_SELLSTOP;}elsereturn;买入止损订单高于价格,卖出止损订单低于价格Price+=Sign*Distance*_Point;for(int i=0; i<OrdersAmount; i++){//计算下一个网格订单的批量double TradeLots;//根据进度类型增加或减少当前批量if(LotsMultMode>mlNone)TradeLots=GetProgressionMember(LotsMultMode,i,((LotsMultMode==mlArithmetical)?LotsMultiplicatorAr:LotsMultiplicatorGm),Lots);elseTradeLots=Lots;double StopLoss,StopLossInPoints;//按步骤的比例计算stoplossStopLossInPoints=StopLossRatio*Step;//买入止损低于开盘价,卖出止损高于开盘价。StopLoss=Price+EMPTY*Sign*StopLossInPoints*_Point;五次尝试发布另一个金字塔订单for(int j=0; j<5; j++){if(OrderSend(_Symbol,Com,NormalizeDouble(TradeLots,2),NormalizeDouble(Price,_Digits),Slippage,NormalizeDouble(StopLoss,_Digits),0,NULL,Magic,0,OrderColor(Com))!=EMPTY)break;elseSleep(1000);}//根据进度类型增加或减少当前步骤if(StepMultMode>mlNone)Step=GetProgressionMember(StepMultMode,i,((StepMultMode==mlArithmetical)?StepMultiplicatorAr:StepMultiplicatorGm),GridStep);买入止损订单高于价格,卖出止损订单低于价格Price+=Sign*Step*_Point;}//我们为刚刚发布的延期订单安装通用胶粘if(TakeProfit>0){double tp=NormalizeDouble(Price+Sign*(TakeProfit<StopLevel?StopLevel:TakeProfit)*_Point,_Digits);for(int i=OrdersTotal()-1; i>=0; i--)if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol && OrderType()>OP_SELL){if(NormalizeDouble(OrderTakeProfit(),_Digits)!=tp){for(int j=0; j<5; j++)if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0))break;elseSleep(1000);}}}}

功能CommonStopLoss()

跟踪挂起的订单激活和修改市场订单止损的关键功能。每一个新激活的市场订单都是金字塔起始价格最远的。因此,当出现止损时,所有以前的市场订单都被设置为新订单的止损水平:

//+------------------------------------------------------------------+//更新金字塔市场订单的总成交量,即..//将所有市场订单的100%设置在一个水平上。//+------------------------------------------------------------------+void CommonStopLoss(state &Orders){int type;bool refresh;double sl;//市场订单中只有买入,这意味着最初有一个金字塔的待售买入停止订单if(Orders.BuyCount>0 && Orders.SellCount==0){type=OP_BUY;//最高买入订单的100%与最低买入订单的100%不匹配,因此必须//将所有订单设置为最高止损,换句话说,将“拉”到收支平衡中refresh=(NormalizeDouble(Orders.BuyTopSL,_Digits)!=NormalizeDouble(Orders.BuyBottomSL,_Digits));sl=NormalizeDouble(Orders.BuyTopSL,_Digits);}else//市场订单中只有卖出订单,这意味着最初有一个金字塔的待售止损订单if(Orders.BuyCount==0 && Orders.SellCount>0){type=OP_SELL;//最高卖出订单的止损不等于最低卖出订单的止损,这意味着必须//将所有订单设置为最低止损,换句话说,将“拉”到收支平衡中refresh=(NormalizeDouble(Orders.SellTopSL,_Digits)!=NormalizeDouble(Orders.SellBottomSL,_Digits));sl=NormalizeDouble(Orders.SellBottomSL,_Digits);}elsereturn;if(refresh)for(int i=OrdersTotal()-1; i>=0; i--)if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol && OrderType()==type){if(NormalizeDouble(OrderStopLoss(),_Digits)!=sl){for(int j=0; j<5; j++)if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0))break;elseSleep(1000);}}}

您可以在以下动画中更直观地看到函数的工作原理:

处理程序OnTick()

完成交易专家的创建后,根据流程图对所述块的调用算法进行编码。将生成的代码放入处理程序中OnTick():

//+------------------------------------------------------------------+//| Expert tick function                                             |//+------------------------------------------------------------------+void OnTick(){state State;//获取有关顾问打开的订单的信息并将其放入状态结构RefreshState(State);查看新酒吧是否已建成if(IsNewBar()){//如果形成了新的条形图,请使用getSignal()查询指示器//并将结果写入tradesignal变量int TradeSignal=GetSignal();//新酒吧开张时没有延期订单或市场订单if(State.BuyCount==0 && State.SellCount==0 && State.BuyStopCount==0 && State.SellStopCount==0){//如果形成了交易信号,我们将构建一个给定类型的金字塔if(TradeSignal!=EMPTY)BuildPyramid(TradeSignal);//退出,因为进一步处理没有意义,因为要么根本没有搜查令,要么我们刚刚建造了一座金字塔。return;}//如果自网格创建以来形成了更多的Aftersignabarscount条,//或形成相反的信号,删除网格if((State.BuyStopCount>0 && State.BuyCount==0 &&((AfterSignaBarsCount>0 && State.BuyStopStart>0 && iTime(_Symbol,_Period,0)-State.BuyStopStart>=BarsInSeconds) || TradeSignal==OP_SELL))||(State.SellStopStart>0 && State.SellCount==0 &&((AfterSignaBarsCount>0 && State.SellStopStart>0 && iTime(_Symbol,_Period,0)-State.SellStopStart>=BarsInSeconds) || TradeSignal==OP_BUY))){//删除待处理订单DeletePendingOrders();return;}}//有未开仓的买入或卖出订单,意味着金字塔已经建成,//有些延期订单起作用了if(State.BuyCount>0 || State.SellCount>0){//如果需要,更新金字塔市场订单的总止损CommonStopLoss(State);return;}//订单网格在总止损处关闭,删除剩余余额if((State.BuyStopCount>0 && State.BuyStopCount<OrdersAmount && State.BuyCount==0) ||(State.SellStopCount>0 && State.SellStopCount<OrdersAmount && State.SellCount==0)){//删除待处理订单DeletePendingOrders();}}

历史测试

为了测试我们的顾问的工作能力,并评估他的交易算法,我们将做一些测试历史数据我们将在欧元兑美元上测试。质量99.9%.测试期为2017年1月1日至2020年1月1日。H1时间(1小时)初始存款10000件。

默认设置:固定批量0.01,网格距离100 p,间距固定300 p,在15个订单的网格中,随机设置为标准,超卖级别为20,止损比为1.0,我们将等待网格运行,直到反向信号出现。

默认情况下,顾问不会对结果视而不见,也不会合并结果。让我们在指标设置中稍微“推高”超卖和超买水平,将StochaSticleveldn设置为10而不是20。入口将减少,但可能更准确。我们不会触摸其他设置。

这一次,结果明显更好,因为我们只改变了一个参数。

让我们看看顾问在算术级数中如何增加批量。为此,在设置中选择“算术”模式,参数LotsMultiplicatorAr(算术级数差)将值设置为0.01。我们可以保留零,在这种情况下,参数自动等于初始批量,我们的值为0.01。因此,金字塔的第一个订单是0.01,最后一个订单是0.15。我们得到以下图片:

现在,我们将算术级数从0.15减少到0.01。对于此lotsmultiplicatorar参数,我们将其设置为负值-0.01,并将起始批量设置为0.15:

根据趋势交易的特点,减少批量的选项似乎更可取,因为随着趋势的减弱,我们也减少了“溢出”的数量。当然,在这种情况下,利润预期会更高,但下降也会相应增加。

在第一近似中进行的测试显示了整个方法的有效性,特别是顾问的有效性。然而,最终的结论只能从贸易的结果中得出。实际计算无论如何,识字优化参数不会影响顾问。

结论

我们创建的顾问正在实施金字塔战略的数学版本。然而,这种方法的更复杂的变体很难形式化。这是一个问题的代价:所花费的努力是否考虑到金字塔结构的许多细微差别,例如,在交易水平或软件方面技术分析图是否有足够的网格以优化的步骤来帮助顾问?

金字塔化的优点也有严重的缺点。通过金字塔订单可以很好地赚钱的强大趋势并不经常发生。在长笛中,这种策略导致了金钱的损失。因此,识别趋势运动的任务仍然是金字塔形交易中的主要任务,无论是手动交易还是自动交易。

在我们的顾问中,按照趋势构建金字塔、跟踪市场订单和固定利润的机制得到了充分的阐述。在这个工具的基础上,您可以通过处理顾问的信号部分或计算网格参数来创建自己的金字塔主题变体,例如,考虑到当前波动性.

辅导员的源代码提供了详细的、几乎逐行的注释,因此可以被视为独立的学习材料。

从课堂上下载顾问源

论坛主题

尊敬的尤里·洛塞夫AKA LSV107
Tlap.com



MQL4教程 ,,,,,