Ваши вопросы по языку MQL4

eevviill

Заблокирован
Проблема в этой части кода. Я ее закоментировал, советник заработал. но без этой части, ордер не будет закрываться, пока не окупит весь убыток.
Ты же программист, ты можешь увидеть , что не так, подскажи. Очень нужна эта вещь!
for (int t=0; t<OrdersTotal(); s++) {
if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();

if (profit >= ubytok + Nado_profit) {
if (OrderType()==0) OrderClose(OrderTicket(),OrderLots(), Bid,0);
if (OrderType()==1) OrderClose(OrderTicket(),OrderLots(), Ask,0); }}
int t=0; t<OrdersTotal(); s++
не s++
а
t
и ордерс тотал -1
 

gzh

Интересующийся
Исправил всякие мелкие опечатки, теперь советник работает, не зависает. НО! другая проблема: ордера плодятся, один за другим открываются, теперь походу вообще ничего из этого алгоритма не работает так, как надо. Вообще странно!!!

вот код правильный, исправлены всякие опечатки.

for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
if (OrderSelect (s,SELECT_BY_POS, MODE_HISTORY))

if (OrderProfit() < 0) ubytok += OrderProfit(); }

for (int t=0; t<OrdersTotal(); t++) {
if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();

if (profit >= ubytok + Nado_profit) {
if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(), Bid,0);
if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(), Ask,0); }}

for (int p=OrdersTotal()-1; p>=0; p--) {
OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Bid,0); }


if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Ask,0); } }


if (OrdersTotal()==0) {
if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
 

eevviill

Заблокирован
Исправил всякие мелкие опечатки, теперь советник работает, не зависает. НО! другая проблема: ордера плодятся, один за другим открываются, теперь походу вообще ничего из этого алгоритма не работает так, как надо. Вообще странно!!!

вот код правильный, исправлены всякие опечатки.

for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
if (OrderSelect (s,SELECT_BY_POS, MODE_HISTORY))

if (OrderProfit() < 0) ubytok += OrderProfit(); }

for (int t=0; t<OrdersTotal(); t++) {
if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();

if (profit >= ubytok + Nado_profit) {
if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(), Bid,0);
if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(), Ask,0); }}

for (int p=OrdersTotal()-1; p>=0; p--) {
OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Bid,0); }


if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Ask,0); } }


if (OrdersTotal()==0) {
if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
Глянь в мой шаблон как прибіль считается и ордера. Может легче станет.
 

Вложения

  • Shabl (9).mq4
    18,8 КБ · Просмотры: 18

gzh

Интересующийся
К сожалению ничего не понятно. Я только учусь программированию, пока еще плохо читаю другие коды, тем более написанные опытными программистами.
Может ты подскажешь, что не так в моем коде ? ты опытный программист, а мой код очень простой, тебе в нем увидеть ошибку легко.
А ? (Я кстати твои уроки по MQL4 читал, нового много узнавал)
 

eevviill

Заблокирован
К сожалению ничего не понятно. Я только учусь программированию, пока еще плохо читаю другие коды, тем более написанные опытными программистами.
Может ты подскажешь, что не так в моем коде ? ты опытный программист, а мой код очень простой, тебе в нем увидеть ошибку легко.
А ? (Я кстати твои уроки по MQL4 читал, нового много узнавал)
if (OrdersTotal()==0) {
if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
Если это единсвенный блок открытия ордеров, то я не понимаю где ошибка.
if(OrdersTotal()==0)
должно действоать безотказно.
Скорее всего ордера после открытия сразу закрываются.
Искать где ошибка не буду так как это тебе опыта не прибавит.
Поэтапно напиши что ты делаешь и для чего.
 

gzh

Интересующийся
Да, по моему ордера открываются и сразу закрываются.

/*здесь я делаю переворот, т.е. если открыт Бай и сигнал приходит на Селл,тогда закрываю Бай открываю Селл */
for (int p=OrdersTotal()-1; p>=0; p--) {
OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Bid,0); }

if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Ask,0); } }

//------------------------------------------------------------------------------------

//здесь собираю информацию о всех убыточных ордерах (закрытых)
for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
if (OrderSelect (s,SELECT_BY_POS, MODE_HISTORY))

if (OrderProfit() < 0) ubytok += OrderProfit(); }
//----------------------------------------------------------------------------------------

//здесь происходит закрытие, если ордер окупил все предыдущие убытки и плюс заработал некоторый профит.

for (int t=0; t<OrdersTotal(); t++) {
if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();

if (profit >= ubytok + Nado_profit) {
if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(), Bid,0);
if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(), Ask,0); }}
//----------------------------------------------------------------------------------------

//здесь я открываю ордера
if (OrdersTotal()==0) {
if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
 

eevviill

Заблокирован
Да, по моему ордера открываются и сразу закрываются.

/*здесь я делаю переворот, т.е. если открыт Бай и сигнал приходит на Селл,тогда закрываю Бай открываю Селл */
for (int p=OrdersTotal()-1; p>=0; p--) {
OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Bid,0); }

if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Ask,0); } }

//------------------------------------------------------------------------------------

//здесь собираю информацию о всех убыточных ордерах (закрытых)
for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
if (OrderSelect (s,SELECT_BY_POS, MODE_HISTORY))

if (OrderProfit() < 0) ubytok += OrderProfit(); }
//----------------------------------------------------------------------------------------

//здесь происходит закрытие, если ордер окупил все предыдущие убытки и плюс заработал некоторый профит.

for (int t=0; t<OrdersTotal(); t++) {
if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit();

if (profit >= ubytok + Nado_profit) {
if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(), Bid,0);
if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(), Ask,0); }}
//----------------------------------------------------------------------------------------

//здесь я открываю ордера
if (OrdersTotal()==0) {
if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
PHP:
/*здесь я делаю переворот, т.е. если открыт Бай и сигнал приходит на Селл,тогда закрываю Бай открываю Селл */
for (int p=OrdersTotal()-1; p>=0; p--) {
OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Bid,0); }

if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) {
OrderClose(OrderTicket(),OrderLots(),Ask,0); } 
break;}
брейк надо.
И если после иф выполняется одно действие то кадратных скобок не надо.
Теперь бери по очереди каждый блок и смотри правильно ли он работает.
 

hoz

Активный участник
К сожалению ничего не понятно. Я только учусь программированию, пока еще плохо читаю другие коды, тем более написанные опытными программистами.
Может ты подскажешь, что не так в моем коде ? ты опытный программист, а мой код очень простой, тебе в нем увидеть ошибку легко.
А ? (Я кстати твои уроки по MQL4 читал, нового много узнавал)


А ещё легче научится уважать более опытных программистов и красиво оформлять свои вопросы. Я лично и смотреть не буду в коды, которые задающий вопрос поленился запихнуть в BB-код.
 

gzh

Интересующийся
Я не знаю как вставить ВВ-код. Лень тут ни причем, и Уважение тоже!
 

rusk

Прохожий
Извините, что вмешиваюсь в разговор уважаемых профи.
Я новичок, и моя проблема, наверное, насмешит Вас. Может, подскажете выход из ситуации?
Пытаюсь наладить советник. Взял в интернете текст готового советника - Avalanche (т.е."Лавина"). Думаю, о нем что-то знаете.
Запустил у себя (МТ4)- не идет. Отладка привела к парадоксу:

В программе есть обращение к OrderSend(). Компилятор ошибок не выдают. При вычислении - сообщение ошибка 130. Т.е. проблемы в неправильном выставлении S/L и T/P. Поставил в фактические параметры при вызове OrderSen() вместо S/L и T/P нули. Т.е. от стоплосов и тейкпрофитов отказался. Однако ошибка 130 остается!!!
Других обращений к функциям с возможной ошибкой 130 (например, OrderModify()) нет. Трассировка показывает, что управление доходит до обращения к OrderSen(), получает ticket=-1 и выдает сообщение 130.
Что все это может означать? Буду благодарен за оценку ситуации
 

ansol

Местный знаток
Я не знаю как вставить ВВ-код. Лень тут ни причем, и Уважение тоже!
Есть инструкция по пользованию форумом, раз не прочитал - значит лень! :)
Нажми на кнопочку "php" или напиши PHP в квадратных скобках, вставь код, затем напиши /PHP тоже в квадратных скобках типа так:

[РНР]КОД здесь[/РНР]
 

gzh

Интересующийся
PHP:
 for (int p=OrdersTotal()-1; p>=0; p--) {
     OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderClose(OrderTicket(),OrderLots(),Bid,0); 
    
if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderClose(OrderTicket(),OrderLots(),Ask,0); }  
    
    for (int s=OrdersHistoryTotal()-1; s>=0; s--) {
     if (OrderSelect (s,SELECT_BY_POS, MODE_HISTORY))

     if (OrderProfit() < 0) ubytok += OrderProfit(); } 

     
          
     for (int t=0; t<OrdersTotal(); t++) {
      if (OrderSelect (t, SELECT_BY_POS, MODE_TRADES)) profit = OrderProfit(); 

   if (profit >= ubytok + Nado_profit) {
   if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(), Bid,0);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(), Ask,0); }} 
    
    
    if (OrdersTotal()==0) {
    if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
    if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
 

gzh

Интересующийся
Во)) получилось) красиво выглядит по сравнению с тем, что писал раньше. Спасибо, что подсказал как пользоваться. Ты вчера говорил, что сегодня глянешь, что не так в коде.
 

ansol

Местный знаток
А чё не работает-то, собственно? Подробнее, плз, а то неясно, чего искать. Или что в логах пишет, к примеру?
 

gzh

Интересующийся
Проблемы две.
1. Советник открывает ордер и почти сразу закрывает его.
вот пример:
Акция intel

ордер лот цена прибыль баланс
38 2013.09.04 16:32 close 19 1.00 22.41 0.00 0.00 -5.12 10077.15
39 2013.09.04 16:32 buy 20 1.00 22.44 0.00 0.00 10077.15
40 2013.09.04 16:32 close 20 1.00 22.44 0.00 0.00 -1.12 10076.03
41 2013.09.04 16:32 buy 21 1.00 22.47 0.00 0.00 10076.03
42 2013.09.04 16:33 close 21 1.00 22.43 0.00 0.00 -5.12 10070.91
43 2013.09.04 16:33 buy 22 1.00 22.46 0.00 0.00 10070.91
44 2013.09.04 16:33 close 22 1.00 22.44 0.00 0.00 -3.12 10067.79
45 2013.09.04 16:33 buy 23 1.00 22.47 0.00 0.00 10067.79
46 2013.09.04 16:33 close 23 1.00 22.43 0.00 0.00 -5.12 10062.67
47 2013.09.04 16:33 buy 24 1.00 22.46 0.00 0.00 10062.67
48 2013.09.04 16:33 close 24 1.00 22.42 0.00 0.00 -5.12 10057.55
49 2013.09.04 16:33 buy 25 1.00 22.45 0.00 0.00 10057.55
50 2013.09.04 16:34 close 25 1.00 22.41 0.00 0.00 -5.12 10052.43
51 2013.09.04 16:34 buy 26 1.00 22.44 0.00 0.00 10052.43
52 2013.09.04 16:34 close 26 1.00 22.40 0.00 0.00 -5.12 10047.31
53 2013.09.04 16:34 buy 27 1.00 22.43 0.00 0.00 10047.31
54 2013.09.04 16:34 close 27 1.00 22.39 0.00 0.00 -5.12 10042.19
55 2013.09.04 16:40 buy 28 1.00 22.43 0.00 0.00 10042.19
56 2013.09.04 16:40 close 28 1.00 22.39 0.00 0.00 -5.12 10037.07

2проблема: ведь ордер должен закрыть только тогда, когда он окупит все убытки и заработает профит.
 

gzh

Интересующийся
Я извиняюсь, что так криво получилось сообщение, я все ровнял, а оно вон как все равно.
 

gzh

Интересующийся
Если по порядку, с этой частью все норм!
PHP:
  for (int p=OrdersTotal()-1; p>=0; p--) {
     OrderSelect(p,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY && Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderClose(OrderTicket(),OrderLots(),Bid,0); 
    
if (OrderType()==OP_SELL && Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderClose(OrderTicket(),OrderLots(),Ask,0); } 

if (OrdersTotal()==0) {
    if (Bid > iOpen(Symbol(),PERIOD_MN1,0)+otstup*Point) OrderSend (Symbol(), OP_BUY, lot, Ask, 0, 0, 0);
    if (Bid < iOpen(Symbol(),PERIOD_MN1,0)-otstup*Point) OrderSend (Symbol(), OP_SELL, lot, Bid, 0, 0, 0); }
 

ansol

Местный знаток
Тут кажись пена:
PHP:
if (profit >= ubytok + Nado_profit) {
убыток-то у нас отрицательное число, профит - положительное :)
Т.е. так, видимо надо:
PHP:
if (profit >= Nado_profit-ubytok) {
Типа, профит покрывает убыток на величину Nado_profit
Раз закрывает, значит, условие сразу же выполняется. Что ж ты на калькуляторе условие не мог проверить? :(
 

eevviill

Заблокирован
Извините, что вмешиваюсь в разговор уважаемых профи.
Я новичок, и моя проблема, наверное, насмешит Вас. Может, подскажете выход из ситуации?
Пытаюсь наладить советник. Взял в интернете текст готового советника - Avalanche (т.е."Лавина"). Думаю, о нем что-то знаете.
Запустил у себя (МТ4)- не идет. Отладка привела к парадоксу:

В программе есть обращение к OrderSend(). Компилятор ошибок не выдают. При вычислении - сообщение ошибка 130. Т.е. проблемы в неправильном выставлении S/L и T/P. Поставил в фактические параметры при вызове OrderSen() вместо S/L и T/P нули. Т.е. от стоплосов и тейкпрофитов отказался. Однако ошибка 130 остается!!!
Других обращений к функциям с возможной ошибкой 130 (например, OrderModify()) нет. Трассировка показывает, что управление доходит до обращения к OrderSen(), получает ticket=-1 и выдает сообщение 130.
Что все это может означать? Буду благодарен за оценку ситуации
130 ошибка это ещё не верная цена для отложек.
 
Верх