[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 497

 
sss2019:

А вот скажите мне как рациональней будет написать советник по такому условию:

Есть три валютные пары, на которых советник будет открывать сделки, и при этом советник прикрепляется только к одному графику, а на других двух работает сам, вобщем мультивалютный.

Второе условие это при достижении цены определенного уровня на любой из валютных пар открывается сделка. Одновременно может быть открыта только одна сделка.

Как только сделка закрывается, советник может заново открывать сделку по любой из пар, если цена подошла.

Я сделал это так, задал статическую переменную, пока значение переменной false - открытие сделок разрешено, и как только открывается ордер по любой из пар переменная принимает значение true. А как только сделка закрывается, и цикл for не может найти не одной сделки, то переменная опять принимает значение false.

А если например для каждой из пар должна быть открыта всего одна сделка, то получается у каждой пары своя переменная должна быть.

Есть ли более рациональное решение этой задачи?


для этого в ордере есть такой параметр как "Магик" - просто считаете ордера с определенным магиком и разрешаете, или запрещаете сделки.
 

Как правильно закрывать ордера? и как правильно собирать инф-цию о них?

Извиняюсь конечно за глупые вопросы заранее) Тут я написал текст след. алгоритма: я хочу чтобы открывалась позиция на покупку когда открытие ниже фрактала вверх и закрытие выше фрактала вверх, и позиция на продажу когда открытие свечи выше фрактала вниз и закрытие ниже, и еще одно условие закрытия ВСЕХ позиций: если они уходят в минус на 85 пунктов, либо если ордер был открыт в течение 38ми свечей(const. S).Вроде это я тут написал, НО, когда я делаю тест, там просто какая то дикая сетка из открытых и закрытых ордеров) иными словами, у меня ощущение что вообще ничего не закрывается, просто штампуются ордера и все, и вообще, у меня ощущение что я как то не првильно обращаюсь с ордерами, не так оперирую, ну и как следствие, не так закрываю)) расскажите как их правильно закрывать, чтобы не проскакивало закрытие? и где в этом коде ошибки. Ну или можно в пример какю нить прогу, в которой все эти операции делаются адекватно. Заранее спасибо за помощь!!)


extern int S=38;//число свечей, после которых закроется позиция
extern int SL=85;//стоп, при котором в любом случае позиции будут закрыты
extern int HIGH=0; //по каком таймфрейму будут производиться поиски экстремумов(5 или 1 или 0(D1))
extern int l=1; // число лотов для торговли
int massorder[30][30]; //тут данные об ОТКРЫТЫХ лотах
int numb=1; //номер эл-та в массиве, который соотв. открытому лоту
int i=0;
int ticket=0;
int x=0;
double down,up=0;
double highH1,lowH1=0;

int start()

{
if(Hour()>x)
{
searchH1();
up=highH1;
down=lowH1;
i++;
}
//----
if(Open[1]<up && Close[1]>up)//если свеча ниже по открытию и выже по закрытию, чем уровень фрактала вверх, то
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL);
i=0;
savedata();
}
if(Open[1]>down && Close[1]<down)//если свеча выше по открытию и ниже по закрытию, чем уровень фрактала вниз, то
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL);
i=0;
savedata();
}
if(i==S)
{
closeAllticket();
closeAllPos();
}
i++;
//----
x=Hour();
if(Hour()==23)
x=-1;
return(0);
}
//+------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5);
OrderClose(massorder[j][0],l,Bid,5);
}
numb=0;
}
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS);
OrderClose(OrderTicket(),l,Ask,5);
OrderClose(OrderTicket(),l,Bid,5);
}
}
void searchH1()//функция поиска фрактала
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,5))
highH1=iHigh(Symbol(),PERIOD_H1,3);

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3);
return (0);

}

void savedata() //программа для сохранения в массив данных
{

OrderSelect(ticket,SELECT_BY_TICKET);
massorder[numb][0]=OrderTicket();
massorder[numb][1]=OrderOpenPrice();
massorder[numb][2]=OrderStopLoss();
massorder[numb][3]=OrderTakeProfit();
if(OrderType()==OP_BUY)
massorder[numb][4]=0;
if(OrderType()==OP_SELL)
massorder[numb][4]=1;
numb++;

}
 
Qwertee:

Как правильно закрывать ордера? и как правильно собирать инф-цию о них?

Извиняюсь конечно за глупые вопросы заранее) Тут я написал текст след. алгоритма: я хочу чтобы открывалась позиция на покупку когда открытие ниже фрактала вверх и закрытие выше фрактала вверх, и позиция на продажу когда открытие свечи выше фрактала вниз и закрытие ниже, и еще одно условие закрытия ВСЕХ позиций: если они уходят в минус на 85 пунктов, либо если ордер был открыт в течение 38ми свечей(const. S).Вроде это я тут написал, НО, когда я делаю тест, там просто какая то дикая сетка из открытых и закрытых ордеров) иными словами, у меня ощущение что вообще ничего не закрывается, просто штампуются ордера и все, и вообще, у меня ощущение что я как то не првильно обращаюсь с ордерами, не так оперирую, ну и как следствие, не так закрываю)) расскажите как их правильно закрывать, чтобы не проскакивало закрытие? и где в этом коде ошибки. Ну или можно в пример какю нить прогу, в которой все эти операции делаются адекватно. Заранее спасибо за помощь!!)


в глобальных переменых, там где вы указали в самом начали стопы

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

перед открытием ордеров:

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

в сигнале на открытие

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

в конец советника

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

в роде ниче не забыл

 
belck:


в глобальных переменых, там где вы указали в самом начали стопы

перед открытием ордеров:

в сигнале на открытие

в конец советника

в роде ниче не забы



Я вставил все что вы написали но тем не менее ничего не поменялось почему то. вообщем результат какой был, такой и остался, все равно ордера остаются открытыми большое кол-во времени, а мне нужно чтобы они закрывались через S баров, в чем же дело?????????????????

Файлы:
ikdgna.mq4  7 kb
 
Qwertee:


Я вставил все что вы написали но тем не менее ничего не поменялось почему то. вообщем результат какой был, такой и остался, все равно ордера остаются открытыми большое кол-во времени, а мне нужно чтобы они закрывались через S баров, в чем же дело?????????????????

вызывать закрытие ордеров нужно ставить перед открытием ордеров. есть у меня такие по закрытию. возможно пригодятся:

перед самыми глобальными

#include <stdlib.mqh>


вот так вызывать перед открытием ордеров:

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

а это в самый конец советника

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

Вопрос к знатокам, есть ли какие-либо критерии к советникам, таких как- минимальное количество лотов для определенного временного периода теста? Процент убыточности и т.п.?

Просто 2 советника, а они за год делают один 100 сделок, другой вообще 30... (таймфрейм 15, 30 соответсвенно). Прибильность хорошая, первый в демо на реальных котировках сейчас стоит тестится... но может кто подскажет есть более лучше тесты чем в MT4?

 
Подскажите как выполнить условие? Вот есть условие, открыть ордер на покупку по текущей цене, как только цена дошла до 1.2550. Получается когда цена становыится больше или равна 1.2550 откурывается ордер, а когда ордер открывается, то статическая переменная блокирует открытие новых ордеров, до тех пор пока ордеров не станет 0. И получается как только ордер закрылся, ордеров больше нет с таким магиком, то запрет на открытие снимается и сразу же открывается новый ордер, но цена то уже давно ушла от этого уроня. Нужно именно чтобы советник открывал рыночные ордера как цена дойдет до уровня, а не отложенные.
 

Всем знатокам привет))))

есть такой индюк который рисует трендовую по двум последним фракталам, но он рисует ее по "неподтвержденному фракталу", т.е. второй бар еще не сформировался после фрактального а линия уже нарисовалась. Как сделать чтобы она рисовалась после вторго бара а не после первого? Индюк во вкладке.

Файлы:
 
rigc:

Всем знатокам привет))))

есть такой индюк который рисует трендовую по двум последним фракталам, но он рисует ее по "неподтвержденному фракталу", т.е. второй бар еще не сформировался после фрактального а линия уже нарисовалась. Как сделать чтобы она рисовалась после вторго бара а не после первого? Индюк во вкладке.


Попробуйте
Файлы:
 
Figar0:

Попробуйте
вообще не рисует)))
Причина обращения: