extremumprice.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------------externint Quant_Bars =30; // Количество баровbool OpnBuy =false,
OpnSell =false;
//--------------------------------------------------------------------int start() // Спец. функция start
{
int i; // Номер бара double Minimum=Bid, // Минимальная цена
Maximum=Bid; // Максимальная ценаfor(i=0;i<=Quant_Bars-1;i++) // От нуля (!) до..
{ // ..Quant_Bars-1 (!)if (Low[i]< Minimum) // Если < известного
Minimum=Low[i]; // то оно и будет минif (High[i]> Maximum) // Если > известного
Maximum=High[i]; // то оно и будет макс
}
//--------------------------------------------------------------------if (iOpen(NULL,0,1)>Maximum)
{
OpnBuy =true:
OpnSell=false;
}
if (iOpen(NULL,0,1)<Minimum)
{
OpnSell=true;
OpnBuy =false:
}
//-------------------------------------------------------------------// А тут код открытия позиций. if (OpnBuy) {открываем Бай};// if (OpnSell) {открываем Селл};// Но обязательно нужно сделать проверку на существование уже открытой позиции,// иначе они будут открываться на каждом тике пока присутствует сигнал...return; // Выход из start()
}
//--------------------------------------------------------------------
//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------if (Equ_NEW>=Equ_OLD+EquPerc) // Новое эквити больше старого на процент прибыли..
{
// ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
ClosePosFirstProfit(NULL, -1, -1); // Закрываем все позиции, сначала прибыльные
DeleteOrders(NULL, -1, -1); // Удаляем ордера
Equ_NEW=AccountEquity(); // Запоминаем новое значение эквити
Equ_OLD=Equ_NEW; // и вписываем его в "старое"
CountClsEQU++; // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
LockBuy51 =true; // Разрешаем открытие локирующих
LockSell51=true; // позиций Buy и Sell
OpnBuy51 =true; // и вообще разрешаем открываться
OpnSell51 =true; // в любую сторону...
}
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------if (Equ_NEW<=Equ_OLD-EquPerc/2) // Новое эквити меньше старого на столько-то процентов...
{
Trade=false; // Запрещаем торговлю//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES)) // Выбираем убыточную позицию (если её тикет
{ // ранее был сохранён в TicketLoss)double prloss=OrderProfit()+OrderSwap(); // Размер профита убыточной позицииint typeloss =OrderType(); // Тип убыточной позицииint mnloss =OrderMagicNumber(); // Magic убыточной позиции
}
if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES)) // Выбираем локирующую позицию (если её тикет
{ // ранее был сохранён в TicketLock)double prlock=OrderProfit()+OrderSwap(); // Размер профита локирующей позицииint typelock =OrderType(); // Тип локирующей позиции
}
if (prloss+prlock>=10*Point) // Если их суммарный профит больше 10 пунктов
{
ClosePositions(NULL, typelock, 5100); // Закрываем локирующую позицию
ClosePositions(NULL, typeloss, mnloss); // Закрываем убыточную позицию
}
//--------------- Поиск убыточной позиции и установка локирующей ------------------------- double Loss=0; // Последнее значение убыткаint i, k=OrdersTotal(), OrdTicket=-1;
for (i=k-1; i>=0; i--) { // Цикл по всем ордерам терминалаif (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderProfit()+OrderSwap()<0)) { // Если профит позиции меньше 0if (Loss>OrderProfit()+OrderSwap()) { // Если последнее значение убытка больше убытка позиции
Loss=OrderProfit()+OrderSwap(); // Значит тут убыток больше, запоминаем как последнее
OrdTicket=i; // Запоминаем номер убыточной позиции
}
}
}
}
if (OrdTicket>=0) {
if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) { // Выбираем позицию по тикету
TicketLoss=OrdTicket; // Запоминаем как тикет убыточной позыif (OrderType()==OP_BUY) // Если её тип Бай
{
Magic=5100; // Задаём магик...
New_Comm="Sell_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_SELL, 5100, 0)){ // Если нет локирующего Sell
OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_SELL, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Sell
}
if (OrderType()==OP_SELL)
{
Magic=5100; // Задаём магик...
New_Comm="Buy_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_BUY, 5100, 0)){ // Если нет локирующего Buy
OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_BUY, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Buy
}
}
}
}
从
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
不要从零条开始计算高点和低点,而是从第一条开始,在零条上,买入价不能低于最小值。
双
Min=Bid,变量声明
最大=出价。
____________________________________________________________________________________________
for (i=0;i<=20-1;i++) 打开标准
{如果(Low[i]<Min)Min=Low[i]。
如果(High[i]>Max)Max=High[i]。
}
如果(................. &&Ask>Max)
{
Opn_B=true; //开放购买
}
如果 (................ &&Bid<Min)
{
Opn_S=true; //打开Sell
}
___________________________________________________________________________________________
我很抱歉它是如此的丑陋--我不得不从记忆中写出来,因为代码不工作,我把它删除了。但你作为一个专业人士,应该是可以理解的(我希望)。
____________________________________________________________________________________________
你太夸奖我了 :))我和你一样是个初学者...
情况是这样的。没有检查,只是当场写了......因此,逻辑是这样的。
1.用一个神奇的数字设置挂单,比如101,并重置标志,将订单转换为头寸,比如ConvOrd=false。
2.检查是否出现了带有魔法101的位置;如果是,设置转换标志ConvOrd=true。
3.检查ConvOrd的真假,如果ConvOrd==真。
我们检查带有神奇数字101的位置是否存在--如果它丢失了
这意味着它已经被关闭。
{deselect ConvOrd=false; set a new pending one;}.
我认为我们可以不使用旗帜...
我明白这个逻辑,但我不知道如何在代码中实现它。我已经尝试了很多变种,但我没有得到任何结果。我想我是个傻瓜。这就是我在这里写的原因。在第663页,我向你展示了我的代码。如果你有兴趣,请告诉我如何改进它,或者至少告诉我如何改进它。谢谢你。
试试更简单的方法,当你下一个SellStop订单时,记住TakeProfit值,如果Bid低于这个价格,就把它放在Buy上。
试试更简单的方法,当你下一个SellStop订单时,记住TakeProfit值,如果Bid低于这个价格,就把它放在Buy上。
谢谢你的建议!我已经试过这个选项,但它不适合我的策略。
我不明白为什么同时有两个锁定的位置。其逻辑是这样的。
当权益达到之前利润的某一百分比时,我们就关闭所有头寸...这可以正常工作...下一步...
如果股权比以前的价值下降了一定的百分比,寻找损失最大的头寸,确定它是谁......购买或出售...
并在相反方向用双拍打开一个锁定位置。然后我们看一下他们的总利润(亏损和锁仓的),只要它变大。
比方说10个点,关闭它们...
从逻辑上讲,应该在下一次打勾时检查股权,如果一切正常,我们继续工作......。如果一切再次正常,我们将不得不寻找下一个傻瓜......
但由于某些原因,它同时打开了两个锁定位置......。和买入和卖出,如果手数是0.1,那么第一次锁仓开出的手数是两倍=0.2。
而第二个人又翻了一番,以0.4手开盘......恭敬地说,如果他们为了太阳下的一席之地而相互争斗,那还有什么鬼地方呢......。:(
我把代码附在后面,也许有人可以用他们的代码戳我。指的是。
从
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
...在某处有一个关节...
页码"666" :-)