О MetaEditor-e - страница 4

 
Renat
mswork,

Вы уже показали свой уровень знания МетаТрейдера. Больше не утруждайтесь, пожалуйста.


Ренат, Большое Вам Спасибо за столь замечательную программу, как МетаТрейдер! Честное слово!

Простите, если надоедал комментариями. Мне хотелось сделать только лучше.
 
К примеру в той же 1с, к которой я ежедневно работаю, почему-то всегда точно указывается какой структурный оператор я не закрыл.

Вполне возможно, я отстаю от жизни.
Вместе с тем, по моим представлениям сделать это возможно только в простых случаях, например, если каждой открывающей должна соответствовать закрывающая, прежде, чем появится следующая открывыющая (или в аналогичных случаях).
Если же речь идёт о более сложных вложенных структурах, то у компилятора нет критериев, по кот. он может определить какой именно из 10 открывающих не хватает закрывающей.

Да вот хотя бы простой пример:
for (i..)
{
a++;
for (j..)
{
b++;
for (k..)
{
c++;
}
d++;
}
e++;


"Где"? должна стоять недостающая закрывающая? Или "где" та открывающая, в соответствие которой не поставлена закрывающая?

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


Вот как раз в этом случае поможет мое предложение - программа отразит циклы, как она понимает, начиная с вложенных, и программист сразу визуально определит, где не хватает фигурной скобки.
 
К примеру, вот произвольный код (не помню, откуда я его скачивал, кажется, с forex.kbpauk.ru). Я хочу посмотреть, как он работает, оценить его логику. И вижу валом фигурных скобок без форматирования. Да даже, если бы было красивое форматирование, это не спасает ситуации - будут непродуктивные потери времени. А если бы была функция - "отобразить структуру" (подразумеваются вложенные циклы), то я быстренько посмотрел на код, выделил бы для себя главные циклы, может даже на бумажке нарисовал бы себе схему алгоритма, или в код добавил комментарии, или сам бы отредактировал, как душа пожелала. Но! Вначале хотя бы уже готовый код должен анализироваться автоматически, выделяя вложенность циклов.

//+------------------------------------------------------------------+
//| MACD_signal.mq4 |
//| tom112 |
//| tom112@mail.wplus.net |
//+------------------------------------------------------------------+
#property copyright "tom112"
#property link "tom112@mail.wplus.net"
//---- input parameters
extern double TakeProfit = 0;
extern double Lots = 0.1;
extern double TrailingStop = 0;
extern int Pfast=7;
extern int Pslow=36;
extern int Psignal=7;
extern double LEVEL=0.001;
double Points;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
Points = MarketInfo (Symbol(), MODE_POINT);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent=0, MacdPrevious=0, SignalCurrent=0;
double SignalPrevious=0, MaCurrent=0, MaPrevious=0;
int cnt=0, total;
int i1, pp, shift;
double Tv[2][500] ;
double Range, rr, Delta, Delta1, val3;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
if(Bars<100)
{
Print("bars less than 100");
return(0); // на графике менее 100 баров
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0); // проверяем TakeProfit
}
Range = iATR(NULL,0,200,1);
rr = Range*LEVEL;
Delta=iMACD(NULL,0,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_MAIN,0)-
iMACD(NULL, 0 ,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_SIGNAL,0);
Delta1=iMACD(NULL,0,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_MAIN,1)-
iMACD(NULL, 0 ,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_SIGNAL,1);
// теперь надо определиться - в каком состоянии торговый терминал?
// проверим, есть ли ранее открытые позиции или ордеры?
if(OrdersTotal()<1) 
{
// нет ни одного открытого ордера
// на всякий случай проверим, если у нас свободные деньги на счету?
// значение 1000 взято для примера, обычно можно открыть 1 лот
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money");
return(0); // денег нет - выходим
}
// проверим, не слишком ли часто пытаемся открыться?
// если последний раз торговали менее чем 5 минут(5*60=300 сек)
// назад, то выходим
// If((CurTime-LastTradeTime)<300) return(0);
// проверяем на возможность встать в длинную позицию (BUY)
if( Delta>rr && Delta1<rr )
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Points,"macd signal",16384,0,Red); // исполняем
if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());
return(0); // выходим, так как все равно после совершения торговой операции
// наступил 10-ти секундный таймаут на совершение торговых операций
}
// проверяем на возможность встать в короткую позицию (SELL)
if( Delta < -rr && Delta1 > -rr )
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Points,"macd sample",16384,0,Red); // исполняем
if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice());
return(0); // выходим
};
// здесь мы завершили проверку на возможность открытия новых позиций.
// новые позиции открыты не были и просто выходим по Exit, так как
// все равно анализировать нечего
return(0);
};
// переходим к важной части эксперта - контролю открытых позиций
// 'важно правильно войти в рынок, но выйти - еще важнее...'
total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL 
OrderSymbol()==Symbol()) // инструмент совпадает?
{
if(OrderType()==OP_BUY) // открыта длинная позиция
{
// проверим, может уже пора закрываться?
if(Delta<0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
return(0); // выходим
};
// проверим - может можно/нужно уже трейлинг стоп ставить?
if(TrailingStop>0) // пользователь выставил в настройках трейлингстоп
{ // значит мы идем его проверять
if(Bid-OrderOpenPrice()>Points*TrailingStop)
{
if(OrderStopLoss()<Bid-Points*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Points*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
else // иначе это короткая позиция
{
// проверим, может уже пора закрываться?
if(Delta > 0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
return(0); // выходим
}
// проверим - может можно/нужно уже трейлинг стоп ставить?
if(TrailingStop>0) // пользователь выставил в настройках трейлингстоп
{ // значит мы идем его проверять
if((OrderOpenPrice()-Ask)>(Points*TrailingStop))
{
if(OrderStopLoss()==0.0 || 
OrderStopLoss()>(Ask+Points*TrailingStop))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Points*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// the end.
//+------------------------------------------------------------------+



Впрочем, мое дело сказать. Я уже сказал ;-))

 
"Где"? должна стоять недостающая закрывающая? Или "где" та открывающая, в соответствие которой не поставлена закрывающая?


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

Исходя из представленного примера, нельзя сделать никакого предположения о вложенности циклов. И "подсвечивая циклы" программа может просто ввести в заблуждение. Следующее предложение должно бы прозвучать так: "а давайте сделаем возможность подсветки скобок отключаемой!".
Проблем не возникнет изначально, если вложенные конструкции сразу писать с отступом - для этого есть клавиша "tab". Сначала года это второй мой совет начинающим программистам.
 
К примеру, вот произвольный код (не помню, откуда я его скачивал, кажется, с forex.kbpauk.ru). Я хочу посмотреть, как он работает, оценить его логику. И вижу валом фигурных скобок без форматирования.

А вот Рош говорит, что он такие примеры даже не рассматривает. Классическая иллюстрация - "мне было трудно писать, пусть вам будет трудно читать"
 
Вот как раз в этом случае поможет мое предложение - программа отразит циклы, как она понимает, начиная с вложенных, и программист сразу визуально определит, где не хватает фигурной скобки.

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

А кроме того, при первом же касании вопроса любой незадачливый юзер сразу завопит, что "компилятор ничего не понимает!". И в принципе будет абсолютно прав, потому, что он думает об одном, а компилятор о чём-то своём.

Ну, сделали бы такой компилятор и что толку?
Сегодняшнее положение дел юзера не устраивает, потому что показывает всего лишь, что скобки нет.
А компилятор, сделанный по принципам, кот. заложит в него программист Иван Петрович, покажет, кроме того, что скобки нет, ещё и вариант (один из множества возможных), кот. заложит Иван Петрович, где бы эта скобка в принципе могла быть.

Разумеется, что предполагаемое место недостающей скобки , найденное по алгоритму Ивана Петровича, в ряде случаев не будет совпадать с местом, определённым в соответствии с гениальными мыслями юзера, не умеющего самостоятельно расставить скобки.

И кому это нужно? Юзер только ещё больше запутается. Особенно начинающий. А как же? Он ведь будет всецело и безоговорочно доверять компилятору..
 
согласен, что при "правильном" форматировании, достаточно просто отыскать ошибку вручную. ТОЛКО при условии что встав на определенный уровень и двигая курсор вверх-вниз (для поиска пары для скобки) курсор не будет с этого уровня сбиваться, как это происходит сейчас.

p.s. лично я "правильным" считаю стль предложенный Ален И. Голуб в "Правила программирования на Си и Си++"
 
предлагаю в дистрибутив МТ включить книгу
"ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ,
ЧТОБЫ… ВЫСТРЕЛИТЬ СЕБЕ В НОГУ
Правила программирования на Си и Си++"
Ален И. Голуб

:-))
Причина обращения: