int mod_b() { //--------------------------------------------------------------- 2 -- for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: int Tip=OrderType(); // Тип ордера if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер double SL=OrderStopLoss(); // SL выбранного орд. double TP =OrderTakeProfit(); // TP выбранного орд. double Price =OrderOpenPrice(); // Цена выбранн. орд. int Ticket=OrderTicket(); // Номер выбранн. орд. //------------------------------------------------------ 3 -- while(true) // Цикл модификации { double TS=Tral_Stop; // Исходное значение int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист&&((SL<TS && Tip==0)||(SL>TS && Tip==1)) if (TS < Min_Dist) // Если меньше допуст. TS=Min_Dist; // Новое значение TS //--------------------------------------------------- 4 -- bool Modify=false; // Не назначен к модифи switch(Tip) // По типу ордера { case 0 : // Ордер Buy if (NormalizeDouble(SL,Digits)< // Если ниже желаем. NormalizeDouble(Bid-TS*Point,Digits)) { SL=Price+18*Point; // то модифицируем его string Text="Buy "; // Текст для Buy Modify=true; // Назначен к модифи. } break; // Выход из switch case 1 : // Ордер Sell if (NormalizeDouble(SL,Digits)> // Если выше желаем. NormalizeDouble(Ask+TS*Point,Digits) || NormalizeDouble(SL,Digits)==0)//или равно нулю { SL=Price-18*Point; // то модифицируем его Text="Sell "; // Текст для Sell Modify=true; // Назначен к модифи. } } // Конец switch if (Modify==false) // Если его не модифи break; // Выход из while //--------------------------------------------------- 5 --
Alert ("Модификация ",Text,Ticket,". Ждём ответ.."); bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его! //--------------------------------------------------- 6 -- if (Ans==true) // Получилось :) { Alert ("Ордер ",Text,Ticket," модифицирован:)"); break; // Из цикла модифи. }
int mod_f() { //--------------------------------------------------------------- 2 -- for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: int Tip=OrderType(); // Тип ордера if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер double SL=OrderStopLoss(); // SL выбранного орд.
int f = 3; //номер бара с которого идет проверка наличия фрагтала int DnN = 0, UpN = 0; //порядковый номер присвоен к направлению(upper, lower) double UpFr = 0, DnFr = 0; //числовое значение фрагтала выраженное в еденице валюты присвоен к направлению(upper, lower) while (f < Bars && (UpFr == 0 || DnFr == 0)) { if (iFractals(Symbol(), 0, MODE_UPPER, f) != 0) if (UpFr == 0) { UpFr = iFractals(Symbol(), 0, MODE_UPPER, f);//фрактальная отложка вверх(buy) UpN = f; } if (iFractals(Symbol(), 0, MODE_LOWER, f) != 0) if (DnFr == 0) { DnFr = iFractals(Symbol(), 0, MODE_LOWER, f);//фрактальная отложка вниз(sell) DnN = f; } f++; } //------------------------------------------------------ 3 -- while(true) // Цикл модификации { double UD; double TS=UD; // Исходное значение int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист if(Tip==0) UD=DnFr; if(Tip==1) UD=UpFr; if (TS < Min_Dist) // Если меньше допуст. TS=Min_Dist; // Новое значение TS //--------------------------------------------------- 4 -- bool Modify=false; // Не назначен к модифи switch(Tip) // По типу ордера { case 0 : // Ордер Buy if (NormalizeDouble(SL,Digits)< // Если ниже желаем. NormalizeDouble(UD,Digits)) { SL=UD; // то модифицируем его string Text="Buy "; // Текст для Buy Modify=true; // Назначен к модифи. } break; // Выход из switch case 1 : // Ордер Sell if (NormalizeDouble(SL,Digits)> // Если выше желаем. NormalizeDouble(UD,Digits) || NormalizeDouble(SL,Digits)==0)//или равно нулю { SL=UD; // то модифицируем его Text="Sell "; // Текст для Sell Modify=true; // Назначен к модифи. } } // Конец switch if (Modify==false) // Если его не модифи break; // Выход из while //--------------------------------------------------- 5 -- double TP =OrderTakeProfit(); // TP выбранного орд. double Price =OrderOpenPrice(); // Цена выбранн. орд. int Ticket=OrderTicket(); // Номер выбранн. орд.
Alert ("Модификация ",Text,Ticket,". Ждём ответ.."); bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его! //--------------------------------------------------- 6 -- if (Ans==true) // Получилось :) { Alert ("Ордер ",Text,Ticket," модифицирован:)"); break; // Из цикла модифи. }
if (!IfTrueThenCountBarWork)返回(0); for (int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES) if (OrderMagicNumber() == 700000) <---- in this STROKE SAYS ERROR!!! CloseAfterSomeBar (CountBar, OrderTicket()); }
如果(!IfTrueThenCountBarWork)返回(0)。 for (int i = OrdersTotal() - 1; i >= 0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES) if (OrderMagicNumber() == 700000) <---- in this stroke SPEAKS ERROR!!! CloseAfterSomeBar (CountBar, OrderTicket()) }
void CheckForOpen() { double ma; int res; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- getMoving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0) //---- 卖出条件 if(Open[1]>ma && Close[1]<ma) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,",MAGICMA,0,Red) ; return; } //---- 买入条件 if(Open[1]<ma && Close[1]>ma) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0," ,MAGICMA,0,Blue); return; }
结转了。
qaz2005 11.10.2011 09:30
大家下午好! 请指示,有一个自定义指标,它有两个对象。他们的价值我可以查出来,但这里没有办法区分他们,无论是顶线还是底线。我不知道缓冲区的数量和顺序,安装时没有设置。在网上看到,颜色的设置也作为缓冲区,如何通过函数iCustom()或任何其他函数来引用它们来解决这个问题?
提前感谢!
P.S. 是否有任何关于MQL4语言的文献?我已经下载并几乎完成了一个MQL4教程。
缓冲区号码从 "0 "开始计算。
iCustom(NULL, 0, "ind",150, 0,2)。
其中150为周期。
0是缓冲区。
2是一个酒吧。
https://docs.mql4.com/ru/indicators/iCustom
比如说
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
所以最可能的是蓝色=0缓冲区
和红色=1
亚历山大!谢谢你分享你的经验。但沿途我有一个问题,货币枚举是如何进行的?还是用OrderSend()f-i中的货币名称来代替Symbol()?还有,你能不能解释一下如何把你的例子放在代码中?再次感谢您的帮助!:)
罗曼, 基本上解释了。
在Expert Advisor中指定Symbol()的地方,都要写上例如:SymbolMax[nnn]。在OrderSend()中,它看起来像这样tick=OrderSend(SymbolMax[nnnn],OP_BUYSTOP,L,ur,0,sl,tp,CMM,MAGIC[I],0,Red)。
我把它写在我的专家顾问中,你在那里设置你自己的价值。你可以设置货币列表,比如说。
string SymbolMax[4] = {"EURUSD", "GBPUSD", "USDCHF", "USDJPY" };
也许,有人以另一种方式实现它,但这是我的货币查询--见下面的代码。我把开始放在函数的开头。另外,我还做了一个5秒的延迟,以防止信息的跳跃性。
我遇到了一个修改循环的问题。
修改被表示为一个用户定义的函数
最有趣的是,标准线索函数与这两个函数都可以使用,单独使用也很好,但当我用分形修改与Breakeven时,我得到了分形和Breakeven的无尽修改
我基于对https://book.mql4.com/ru/trading/ordermodify 的修改。
我的印象是修改盈亏平衡的标准设置不正确,如何才能解决这个问题,使其不至于冻结?
//ф-я модификации ордеров безубыток
int mod_b()
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double TS=Tral_Stop; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист&&((SL<TS && Tip==0)||(SL>TS && Tip==1))
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Price+18*Point; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(Ask+TS*Point,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=Price-18*Point; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
{
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
//------------------------------------------------------обсчет фрактала
int f = 3; //номер бара с которого идет проверка наличия фрагтала
int DnN = 0, UpN = 0; //порядковый номер присвоен к направлению(upper, lower)
double UpFr = 0, DnFr = 0; //числовое значение фрагтала выраженное в еденице валюты присвоен к направлению(upper, lower)
while (f < Bars && (UpFr == 0 || DnFr == 0))
{
if (iFractals(Symbol(), 0, MODE_UPPER, f) != 0)
if (UpFr == 0)
{
UpFr = iFractals(Symbol(), 0, MODE_UPPER, f);//фрактальная отложка вверх(buy)
UpN = f;
}
if (iFractals(Symbol(), 0, MODE_LOWER, f) != 0)
if (DnFr == 0)
{
DnFr = iFractals(Symbol(), 0, MODE_LOWER, f);//фрактальная отложка вниз(sell)
DnN = f;
}
f++;
}
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double UD;
double TS=UD; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист
if(Tip==0)
UD=DnFr;
if(Tip==1)
UD=UpFr;
if (TS < Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(UD,Digits))
{
SL=UD; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(UD,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=UD; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
亲爱的论坛用户,你们好。
我怎样才能要求其他时间段的报价?我有一个D版的模板,我的指标需要从较小的时间段(例如M30、H1、H4)的报价LOW, HIGH, OPEN, CLOSE。
亲爱的论坛用户,你们好。
我怎样才能要求其他时间段的报价?我有一个D版的模板,我的指标需要从较小的时间段(例如M30、H1、H4)的报价LOW, HIGH, OPEN, CLOSE。
大家晚上好。告诉我这里的错误是什么。这里有一段代码。
//+------------------------------------------------------------------+
//| 启动功能|
//+------------------------------------------------------------------+
void start()
{
//---- 检查历史和交易
if(Bars<100 || IsTradeAllowed()==false) return;
//---- 按当前符号计算未结订单
if(CalculateCurrentOrders(Symbol() ==0) CheckForOpen();
else CheckForClose();
if (!IfTrueThenCountBarWork)返回(0);
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- in this STROKE SAYS ERROR!!!
CloseAfterSomeBar (CountBar, OrderTicket());
}
}
大家晚上好。请告诉我这里的错误是什么。这里有一段代码。
//+------------------------------------------------------------------+
//| 启动功能|
//+------------------------------------------------------------------+
空白启动()。
{
//---- 检查历史和交易情况
如果(Bars<100 || IsTradeAllowed()==false) 返回。
//---- 按当前符号计算未结订单
如果(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
否则CheckForClose()。
如果(!IfTrueThenCountBarWork)返回(0)。
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
if (OrderMagicNumber() == 700000) <---- in this stroke SPEAKS ERROR!!!
CloseAfterSomeBar (CountBar, OrderTicket())
}
}
PapaYozh:
Пропущен символ ";"
谢谢你!!!起初没有注意到。))))。
如何正确输入开盘条件:卖出时Close[2]<Close[3]的n%,买入时当然是相反的,n可以优化吗?
void CheckForOpen()
{
double ma;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- getMoving Average
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0)
//---- 卖出条件
if(Open[1]>ma && Close[1]<ma)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,",MAGICMA,0,Red) ;
return;
}
//---- 买入条件
if(Open[1]<ma && Close[1]>ma)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0," ,MAGICMA,0,Blue);
return;
}
告诉我哪里做错了,请告诉我...或者,如果是MT4本身的问题,但我的买单只在高位开仓,而卖单只在收盘开仓 =)虽然我甚至没有在专家顾问的代码中规定这些条件=)