Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 538

 
denis77515:

Здравствуйте господа профессионалы.Не откажите новичку в программировании, посмотрите код,на правильность написания. Кому не лень разбираться с ним. Это мой первый опыт написания большого кода.На тестере не могу его проверить так как он является мультивалютным .Но торговая система этого стоит. Файл с кодом и индикаторы прилагаю в архиве.


Прикинул для Вас единую функцию для создания связанных массивов символов и количества ордеров (открытых позиций) на покупку и продажу, протестируйте скриптом открыв на демке несколько позиций
string Smbl[];
int CntBuy[],CntSell[];
void OnStart()
 {
    if(CountBuySell(Smbl, CntSell, CntBuy))
       for(int i=0; i<ArraySize(Smbl); i++) PrintFormat(" Symbol %s CntBuy %d CntSell %d", Smbl[i], CntBuy[i], CntSell[i]);
 }
//-------------------
bool CountBuySell(string &symb[], int &cnt_sell[], int &cnt_buy[])
{
   int ot,n,N=0,f=0,cb=0,cs=0;
   string symbol;
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         
         ot=OrderType()+1; if(ot>2)  continue;                       // пропускаем лимит ордера
         symbol=""; symbol=OrderSymbol(); if (symbol=="") continue;  // убедились что символ выбран
         f=0; cb=0; cs=0;                                            // обнулили счетчики и флаг символа
         for (n=0; n<N; n++) if (symbol==symb[n]) f=1;               // если в массиве символ OrderSymbol() уже есть, то не будем увеличивать размерность массивов, просто допишем в нижнем цикле еще 1 позицию
         if (f==0)                                                   // такого символа symbol=OrderSymbol() еще не было, увеличим размерность массивов под новый символ и запишем этот символ
         {
            N++; 
            ArrayResize(symb,N); ArrayResize(cnt_buy,N); ArrayResize(cnt_sell,N);
            symb[N-1]=symbol; cnt_buy[N-1]=0.0; cnt_sell[N-1]=0;
         }
         
         if(ot==1) cb++;  // OP_BUY   для выбранного символа
         else      cs++;  // OP_SELL
         
        // перебираем массив и сравним его с выбранным символом. В найденный индекс запишем для данного символа кол-во откр позиций
        // такоим образом для каждого индекса всех 3 массивов будет соответствовать  конкретный символ и количество позиций покупки и продажи для него
         for (n=0; n<N; n++) if (symbol==symb[n]) { cnt_buy[n]+=cb; cnt_sell[n]+=cs;  }
         
      }
   }
   if(N>0) return(1);   // есть открытые позиции
   return(0);           // позиций нет
}
 
evillive:

Пытаюсь написать простой советник, закрывающий все позиции на счёте при достижении заданных значений прибыли или убытка в валюте депозита (открываюсь по нескольким символам), только он закрывает позиции сразу же при их появлении (((

Никак не пойму, что не так:



Зацени.


extern int profit = 30;

extern int Magic=0;

int CurProfit;

extern bool CurSymbolOnly = false;


int start() // Спец. функция start

{

//счетчик профита всех ордеров

double p1;

int i1, kk1=OrdersTotal(), pr1=0;

for (i1=0; i1<kk1; i1++)

{

if (OrderSelect(i1, SELECT_BY_POS, MODE_TRADES))

{

if (!CurSymbolOnly || OrderSymbol()==Symbol())

{

p1=MarketInfo(OrderSymbol(), MODE_POINT);

if (p1==0) if (StringFind(OrderSymbol(), Symbol())<0) p1=0.0001; else p1=0.01;

if (OrderType()==OP_BUY)

{

pr1+=NormalizeDouble((OrderClosePrice()-OrderOpenPrice())/p1, 0);

}

if (OrderType()==OP_SELL)

{

pr1+=NormalizeDouble((OrderOpenPrice()-OrderClosePrice())/p1, 0);

}

}

}

}

CurProfit=pr1;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if (profit<=pr1)

{

ClosePosWithMaxProfitInCurrency();

}

return(0);

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///закрывает начиная с самого дорогого к самому дешовому

void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1)

{

double pr=0;

int i5, k=OrdersTotal(), np=-1;

if (sy=="0") sy=Symbol();

for (i5=k-1; i5>=0; i5--)

{

if (OrderSelect(i5, SELECT_BY_POS, MODE_TRADES))

{

if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))

{

if (mn<0 || OrderMagicNumber()==mn)

{

if (pr<OrderProfit()+OrderSwap())

{

pr=OrderProfit()+OrderSwap();

np=i5;

}

}

}

}

}

if (np>=0)

{

if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES))

{

{for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;

if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),9);

if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),9);

}

}

}

}

closeotlojnie();

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//закрыть отложные

void closeotlojnie()

{

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

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;

if (OrderType()==OP_BUYSTOP ) OrderDelete(OrderTicket());

if (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket());

if (OrderType()==OP_BUYLIMIT ) OrderDelete(OrderTicket());

if (OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket());

}

}

 
GSB:
Прикинул для Вас единую функцию для создания связанных массивов символов и количества ордеров (открытых позиций) на покупку и продажу, протестируйте скриптом открыв на демке несколько позиций


Спасибо конечно за выделенное время для меня,но для меня пока это сложновато, простите за назойливость. Поясните мне что, где,как ? Как говорится на пальцах.


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

 
GSB, pako, спасибо, что-то я рассеянный стал, такое не замечать...
 
denis77515:

Спасибо конечно за выделенное время для меня,но для меня пока это сложновато, простите за назойливость. Поясните мне что, где,как ? Как говорится на пальцах.


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


Как же Вы ее тестировали на демке если там одни ошибки? Код который представлен не мог торговать. Комменты к коду дописал. Все - дальше трудитесь сами, без знаний и упорного труда... на биржевых площадках и особенно на форексе торговать нельзя. Результат будет однозначный. Настоятельно рекомендую учиться и торговать на демо счете причем строго по выбранной системе ни на шаг не отступая. 2-3 месяца покажут результат, дальше будете решать пригодна ли данная система для вас конкретно и торговли в принципе.
 
Спасибо,будем трудиться !
 
Вопрос к модераторам или администраторам: можно ли изменить свой ник? Попытался зарегистрироваться на MQL5, но оказалось, что этот ник там уже занят, пришлось зарегистрироваться под другим именем. А хотелось бы, чтобы ники там и здесь были одинаковыми. Могу, конечно, и здесь просто зарегистрироваться заново, но уже начал кое-что выкладывать в Code Base и хотелось бы сохранить авторство своих работ (да и постов), просто "переименовавшись". Это возможно?
 
Spy:
Вопрос к модераторам или администраторам: можно ли изменить свой ник? Попытался зарегистрироваться на MQL5, но оказалось, что этот ник там уже занят, пришлось зарегистрироваться под другим именем. А хотелось бы, чтобы ники там и здесь были одинаковыми. Могу, конечно, и здесь просто зарегистрироваться заново, но уже начал кое-что выкладывать в Code Base и хотелось бы сохранить авторство своих работ (да и постов), просто "переименовавшись". Это возможно?

Напишите Рошу в личку. Надеюсь ее найдете. Изложите проблему
 

ОК, спасибо.

 

Здравствуйте! Имея советники на предыдущей версии МетаТрейдара я обновил терминал. После вернулся обратно к 509. Так что советники "побывав" в 60... билде, вернулись в версию терминала, на котором были написаны.

Вопрос такой: что делать с теми экспертами, которые перестали открывать сделки на тестере после "возвращения" и с теми, которые проверить больше не получается (кнопка start в тестере просто не отвечает на клик)?