Простые числа являются ключом к разрешению многих математических проблем и появляются в разных областях математики и ее приложениях. Криптография, имитационное моделирование, тестирование материнских плат персональных компьютеров – вот современный перечень практического применения простых чисел. Поэтому простые числа интересуют не только математиков, но и некоторые коммерческие организации, а также военных (разведку и контрразведку), ввиду их особого применения в области защиты информации.Кстати. Я так и не увидел практического применения здоровенных простых чисел. Есть пример?
#property strict
#property script_show_inputs
input ulong k = 2147483647;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
bool result;
result=fntest(k);
if(result) Print("Число k - простое");
else Print("Число k - составное");
}
//+------------------------------------------------------------------+
bool fntest(ulong num)
{
if(num<2 || !(num&1) || fm(num,3)) return(false);
if(num<4) return(true);
ulong i,n;
n=(ulong)MathSqrt(num);
for(i=5; i<=n; i+=6)
{
if(fm(num,i)) return(false);
if(fm(num,i+2)) return(false);
}
return(true);
}
bool fm(ulong num, ulong x)
{
ulong a;
int i;
while(num>=x)
{
a=x;
while(a<1844674407370955162 && a*10<=num) a*=10;
for(i=2; i<11; i++)
{
if(a*i>num || a*i<=a*(i-1))
{
a*=(i-1);
break;
}
}
num-=a;
}
if(num==0) return(true);
return(false);
}
Для разработки печатных плат есть P-Cad и ему подобные системы, Если мне понадобится плата, я точно её не буду разрабатывать с помощью MQL. Простую я на миллиметровке нарисую, а чуть по сложнее с использованием софта. Кроме того, инженер пыхтящий над платой точно не задумывается о простых числах. Если они и используются то уже в самой системе проектирования. А и программисты, писавшие эту систему, может и думали он них, но точно писали её не на MQL. Та же бодяга с математиками и криптографами.Простые числа являются ключом к разрешению многих математических проблем и появляются в разных областях математики и ее приложениях. Криптография, имитационное моделирование, тестирование материнских плат персональных компьютеров – вот современный перечень практического применения простых чисел. Поэтому простые числа интересуют не только математиков, но и некоторые коммерческие организации, а также военных (разведку и контрразведку), ввиду их особого применения в области защиты информации.
Советник работает. Выдавал ошибку 131 при параметре лота 0,01. При написании советника пришлось смотреть и документацию и ковырять чужие кода. Пока, что бы писать программу чисто из головы речь не идет...Следующая задача.
Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average. Один индикатор с более быстрым периодом усреднения чем второй. Ордер Бай открывается, когда быстрая MA пересекает медленную снизу вверх. Ордер Селл открывается, когда быстрая MA пересекает медленную сверху вниз. Открытие осуществлять по закрытию сигнальной свечи, то есть – свеча на которой было пересечение вверх/вниз должна быть закрыта, а вход на новой свече. Советник должен работать по инструменту своего графика, и открывать только один ордер. Закрытие происходит по стоп уровням СтопЛосс и ТейкПрофит. Переменные MagicNumber, СтопЛосс и ТейкПрофит, а также периоды MA – вывести во входные параметры советника.
Постарайтесь при реализации не использовать лишних операций (действий).
#property strict
// Следующая задача.
// Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average.
// Один индикатор с более быстрым периодом усреднения чем второй.
// Ордер Бай открывается, когда быстрая MA пересекает медленную снизу вверх.
// Ордер Селл открывается, когда быстрая MA пересекает медленную сверху вниз.
// Открытие осуществлять по закрытию сигнальной свечи, то есть – свеча на которой было пересечение вверх/вниз должна быть закрыта, а вход на новой свече.
// Советник должен работать по инструменту своего графика, и открывать только один ордер.
// Закрытие происходит по стоп уровням СтопЛосс и ТейкПрофит.
// Переменные MagicNumber, СтопЛосс и ТейкПрофит вывести во входные параметры советника.
// Постарайтесь при реализации не использовать лишних операций (действий).
//+------------------------------------------------------------------+
input int FastMA = 164; // FastMAPeriod
input ENUM_MA_METHOD FastMAMethod = MODE_EMA; // FastMAMethod
input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // FastMAPrice
input int FastMAShift = 0; // FastMAShift
input int SlowMA = 384; // SlowMAPeriod
input ENUM_MA_METHOD SlowMAMethod = MODE_EMA; // SlowMAMethod
input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // SlowMAPrice
input int SlowMAShift = 0; // SlowMAShift
input double Lots = 0.1; // Lots:
input double TakeProfit = 300; // Take Profit:
input double StopLoss = 100; // Stop Loss:
input int Magic = 12345; // Magic Number:
input int Slippage = 3; // Slippage:
//+------------------------------------------------------------------+
int slipp, ticket;
double point;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//----Определение пяти значного брокера
point = _Point;
if(_Digits == 3 || _Digits == 5)
{
point = 10.0 * Point;
slipp = Slippage * 10;
}
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int OrdersSum=0;
int i=0;
double MA1_0,MA2_0,MA1_1,MA2_1;
int total;
bool resalt;
MA1_0 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 0 ); // Получаем значение FastMA
MA1_1 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 1 ); // Получаем значение FastMA
MA2_0 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 0 ); // Получаем значение SlowMA
MA2_1 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 1 ); // Получаем значение SlowMA
total=OrdersTotal();
//---- buy
if (total<1)
{
if(MA1_1<MA2_1 && MA1_0>MA2_0)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slipp,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",Magic,0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия BUY ордера : ",GetLastError());
return;
}
}
//---- sell
if(MA1_1>MA2_1 && MA1_0<MA2_0)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slipp,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",Magic,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер SELL : ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия SELL ордера : ",GetLastError());
return;
}
}
}
//----
for(i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Bid>=(OrderOpenPrice()+TakeProfit*Point)) // проверим не пора ли закрываться по профиту
{
resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Blue); // закрываем длинную позицию по профиту
break;
}
if(Bid<=(OrderOpenPrice()-StopLoss*Point)) // проверим не пора ли закрываться по ст.лоссу
{
resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Red); // закрываем длинную позицию по стопу
break;
}
}
else
{
if(Ask<=(OrderOpenPrice()-TakeProfit*Point))
{
resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по профиту
break;
}
if(Ask>=(OrderOpenPrice()+StopLoss*Point))
{
resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по стопу
break;
}
}
}
return;
}
Думаю что нужно в строке: point = 10.0 * Point; добавить к Point нижнее подчеркивание _ или как?//----Определение пяти значного брокера point = _Point; if(_Digits == 3 || _Digits == 5) { point = 10.0 * Point; slipp = Slippage * 10; }
Спасибо, должно быть так:Хоть я и не написал ни одного скрипта, индикатора, советника но здесь ошибка...
Думаю что нужно в строке: point = 10.0 * Point; добавить к Point нижнее подчеркивание _ или как?
//----Определение пяти значного брокера
point = _Point;
if(_Digits == 3 || _Digits == 5)
{
point = 10.0 * point;
slipp = Slippage * 10;
}
#property strict
// Следующая задача.
// Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average.
// Один индикатор с более быстрым периодом усреднения чем второй.
// Ордер Бай открывается, когда быстрая MA пересекает медленную снизу вверх.
// Ордер Селл открывается, когда быстрая MA пересекает медленную сверху вниз.
// Открытие осуществлять по закрытию сигнальной свечи, то есть – свеча на которой было пересечение вверх/вниз должна быть закрыта, а вход на новой свече.
// Советник должен работать по инструменту своего графика, и открывать только один ордер.
// Закрытие происходит по стоп уровням СтопЛосс и ТейкПрофит.
// Переменные MagicNumber, СтопЛосс и ТейкПрофит вывести во входные параметры советника.
// Постарайтесь при реализации не использовать лишних операций (действий).
//+------------------------------------------------------------------+
input int FastMA = 164; // FastMAPeriod
input ENUM_MA_METHOD FastMAMethod = MODE_EMA; // FastMAMethod
input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // FastMAPrice
input int FastMAShift = 0; // FastMAShift
input int SlowMA = 384; // SlowMAPeriod
input ENUM_MA_METHOD SlowMAMethod = MODE_EMA; // SlowMAMethod
input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // SlowMAPrice
input int SlowMAShift = 0; // SlowMAShift
input double Lots = 0.1; // Lots:
input double TakeProfit = 30; // Take Profit:
input double StopLoss = 10; // Stop Loss:
input int Magic = 12345; // Magic Number:
input int Slippage = 3; // Slippage:
//+------------------------------------------------------------------+
int slipp, ticket;
double point;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//----Определение пяти значного брокера
point = _Point;
if(_Digits == 3 || _Digits == 5)
{
point = 10.0 * point;
slipp = Slippage * 10;
}
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int OrdersSum=0;
int i=0;
double MA1_0,MA2_0,MA1_1,MA2_1;
int total;
bool resalt;
MA1_0 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 0 ); // Получаем значение FastMA
MA1_1 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 1 ); // Получаем значение FastMA
MA2_0 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 0 ); // Получаем значение SlowMA
MA2_1 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 1 ); // Получаем значение SlowMA
total=OrdersTotal();
//---- buy
if (total<1)
{
if(MA1_1<MA2_1 && MA1_0>MA2_0)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slipp,Ask-StopLoss*point,Ask+TakeProfit*point,"",Magic,0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер BUY : ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия BUY ордера : ",GetLastError());
return;
}
}
//---- sell
if(MA1_1>MA2_1 && MA1_0<MA2_0)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slipp,Bid+StopLoss*point,Bid-TakeProfit*point,"",Magic,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Открыт ордер SELL : ",OrderOpenPrice());
}
else
{
Print("Ошибка открытия SELL ордера : ",GetLastError());
return;
}
}
}
//----
for(i = OrdersTotal()-1; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Bid>=(OrderOpenPrice()+TakeProfit*point)) // проверим не пора ли закрываться по профиту
{
resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Blue); // закрываем длинную позицию по профиту
break;
}
if(Bid<=(OrderOpenPrice()-StopLoss*point)) // проверим не пора ли закрываться по ст.лоссу
{
resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Blue); // закрываем длинную позицию по стопу
break;
}
}
else
{
if(Ask<=(OrderOpenPrice()-TakeProfit*point))
{
resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по профиту
break;
}
if(Ask>=(OrderOpenPrice()+StopLoss*point))
{
resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по стопу
break;
}
}
}
return;
}
просмотрел вчера. Поправил...C++://----Определение пяти значного брокера point = _Point; if(_Digits == 3 || _Digits == 5) { point = 10.0 * point; slipp = Slippage * 10; }
Код определяе 4x значный или 5и значный брокерПо моему так тоже работать не будет. Вверху _Point с большой буквы, внизу с маленькой, думаю что должны быть одинаковые?
point = _Point; // Назначаем переменную point равную переменной _Point, в которой
// хранится размер пункта текущего инструмента в валюте котировки
if(_Digits == 3 || _Digits == 5) // здесь читаем так: если в цене текущего графика
// количество пунктов = 3 или = 5, то
{
point = 10.0 * point; // размер пункта умножаем на 10
slipp = Slippage * 10;
}
input double TakeProfit = 30; // Take Profit:
Читал справочник, хотел сам сделать. Но удалось лишь найти и выписать нужные функции из справочника и ступор. В итоге ,разбирал предложенные коды.Следующая задача.
Напишите скрипт, который находит все выбранные в обзоре рынка инструменты, и выводит имена этих инструментов в журнал. Вывод построчный при помощи функции Print.
int total=SymbolsTotal(true);
Print("Символов ",total);
for(int i=0; i<total; i++)Print(i," ",SymbolName(i,true));
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int n=0;
for(int i=SymbolsTotal(true)-1; i>=0; i--)
{
n++;
Print("Symbol = ",SymbolName(i,true)," - ",n);
}
}
//+------------------------------------------------------------------+
int total=SymbolsTotal(true);
Print("Символов ",total);
string Symbols[];
ArrayResize(Symbols,total);
for(int i=0; i<total; i++)Symbols[i]=SymbolName(i,true);
for(int i=0; i<total; i++)Print(i," ",Symbols[i]);
Тут я тоже конечно же смотрел готовые коды Домовенка и предыдущего советника.Следующая задача.
Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average.
Постарайтесь при реализации не использовать лишних операций (действий).
#property strict
// Следующая задача.
// Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average.
// Один индикатор с более быстрым периодом усреднения чем второй.
// Ордер Бай открывается, когда быстрая MA пересекает медленную снизу вверх.
// Ордер Селл открывается, когда быстрая MA пересекает медленную сверху вниз.
// Открытие осуществлять по закрытию сигнальной свечи, то есть – свеча на которой было пересечение вверх/вниз должна быть закрыта, а вход на новой свече.
// Советник должен работать по инструменту своего графика, и открывать только один ордер.
// Закрытие происходит по стоп уровням СтопЛосс и ТейкПрофит.
// Переменные MagicNumber, СтопЛосс и ТейкПрофит вывести во входные параметры советника.
// Постарайтесь при реализации не использовать лишних операций (действий).
//+------------------------------------------------------------------+
input int FastMA = 55; // МА1
input ENUM_MA_METHOD FastMAMethod = MODE_EMA; // Метод1
input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // Цена1
input int FastMAShift = 0; // Сдвиг1
input int SlowMA = 233; // МА2
input ENUM_MA_METHOD SlowMAMethod = MODE_EMA; // Метод2
input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // Цена2
input int SlowMAShift = 0; // Сдвиг2
input double Lots = 0.1; // Лот
input int TakeProfit = 30; // TP
input int StopLoss = 10; // SL
input int Magic = 12345; // Летающий слоник
input int Slippage = 3; // Проскальзывание
//+------------------------------------------------------------------+
int slipp, ticket;
double point, ima1, ima2, SL, TP;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
point = Point;
slipp = Slippage;
//----Определение пяти значного брокера
if(Digits == 3 || Digits == 5)
{
point *= 10;
slipp *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
ima1 = iMA ( Symbol(), 0, FastMA, FastMAShift, FastMAMethod, FastMAPrice,1 ); // 55
ima2 = iMA ( Symbol(), 0, SlowMA, SlowMAShift, SlowMAMethod, SlowMAPrice,1 ); // 233
if (CountTrades() == 0) // если нет открытых ордеров, то...
{
if (ima1 > ima2 && Bid > ima1) // 55 > 233, И цена на покупку выше Ма55, то...
{
SL = NormalizeDouble(Ask - StopLoss*point,Digits); // считаем стоп стоп-лосс(BUY)
TP = NormalizeDouble(Ask + TakeProfit*point,Digits); // считаем тейк профит(BUY)
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, slipp, 0, 0, "Покупка", Magic, 0, Blue);//открываем BAY
if (ticket < 1) // если ордер не открылся, то возвращает (-1) и...
{
Print("Ошибка открытия ордера BUY: ",GetLastError()); //пишем в журнал об ошибке
}
else if (OrderSelect(ticket,SELECT_BY_TICKET)) // если ордер есть(ticket>1), то...
{
if (OrderModify(ticket,OrderOpenPrice(),SL,TP,0,clrRed)) // модифицируем ордер с выставлением SL и TP
Print ("Ордер BUY успешно модифицирован"); // пишем об успешной модификации
}
else // если OrderModify вернул false, то...
Print ("Ошибка модификации ордера BUY"); // пишем об ошибке модификации
}
else if (ima1 < ima2 && Ask < ima1) // если нет открытых ордеров (строка 76) и если...
// 55 < 233, И цена на продажу ниже Ма 55, то...
{
TP = NormalizeDouble(Bid - TakeProfit*point, Digits); // считаем стоп стоп-лосс(SELL)
SL = NormalizeDouble(Bid + StopLoss*point,Digits); // считаем тейк профит(SELL)
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, slipp, 0, 0, "Продажа", Magic, 0, Red);//открываем SELL
if (ticket < 1) // если ордер не открылся, то возвращает (-1) и...
{
Print("Ошибка открытия ордера SELL: ",GetLastError()); //пишем в журнал об ошибке
}
else if (OrderSelect(ticket,SELECT_BY_TICKET)) // если ордер есть(ticket>1), то...
{
if (OrderModify(ticket,OrderOpenPrice(),SL,TP,0,clrRed)) // модифицируем ордер с выставлением SL и TP
Print ("Ордер SELL успешно модифицирован"); // пишем об успешной модификации
}
else // если OrderModify вернул false, то...
Print ("Ошибка модификации ордера SELL"); // пишем об ошибке модификации
}
}
}
//+------------------------------------------------------------------+
//| Ф. считаем количество ордеров |
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0; // задаем счетчик равным 0
for(int i= OrdersTotal()-1; i>=0; i--) // считам с конца, пока не кончатся ордера
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // выбираем ордер по номеру
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) // если символ и магик совпадают и...
if(OrderType() == OP_BUY || OrderType() == OP_SELL) // если ордер бай или селл...
count ++; // то считаем общее количество открытых ордеров бай и селл
}
}
return(count); // возвращаем функции CountTrades() количество ордеров(cont)
}
//+------------------------------------------------------------------+
SL = NormalizeDouble(Ask - StopLoss*point,Digits); |
Тогда достаточно при печати добавить 1 к i. Совсем не обязательно для этого заводить лишнюю переменную n.Читал справочник, хотел сам сделать. Но удалось лишь найти и выписать нужные функции из справочника и ступор. В итоге ,разбирал предложенные коды.
C++:int total=SymbolsTotal(true); Print("Символов ",total); for(int i=0; i<total; i++)Print(i," ",SymbolName(i,true));
В варианте Бориса, я так понял, n нужен для того, чтобы сделать привычную нумерацию с 1, а не с 0.
int total=SymbolsTotal(true);
Print("Символов ",total);
for(int i=0; i<total; i++)Print(i+1," ",SymbolName(i,true));
Тогда достаточно при печати добавить 1 к i. Совсем не обязательно для этого заводить лишнюю переменную n.
Код:int total=SymbolsTotal(true); Print("Символов ",total); for(int i=0; i<total; i++)Print(i+1," ",SymbolName(i,true));
Разбирал и твой код. Нашлись такие косяки. Кстати, благодаря им я и нашел ошибку, которую описал выше.Спасибо, должно быть так:
C++://----Определение пяти значного брокера point = _Point; if(_Digits == 3 || _Digits == 5) { point = 10.0 * point; slipp = Slippage * 10; }
просмотрел вчера. Поправил...
C++:#property strict // Следующая задача. // Нужно написать советник, торгующий по сигналам двух стандартных технических индикаторов Moving Average. // Один индикатор с более быстрым периодом усреднения чем второй. // Ордер Бай открывается, когда быстрая MA пересекает медленную снизу вверх. // Ордер Селл открывается, когда быстрая MA пересекает медленную сверху вниз. // Открытие осуществлять по закрытию сигнальной свечи, то есть – свеча на которой было пересечение вверх/вниз должна быть закрыта, а вход на новой свече. // Советник должен работать по инструменту своего графика, и открывать только один ордер. // Закрытие происходит по стоп уровням СтопЛосс и ТейкПрофит. // Переменные MagicNumber, СтопЛосс и ТейкПрофит вывести во входные параметры советника. // Постарайтесь при реализации не использовать лишних операций (действий). //+------------------------------------------------------------------+ input int FastMA = 164; // FastMAPeriod input ENUM_MA_METHOD FastMAMethod = MODE_EMA; // FastMAMethod input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // FastMAPrice input int FastMAShift = 0; // FastMAShift input int SlowMA = 384; // SlowMAPeriod input ENUM_MA_METHOD SlowMAMethod = MODE_EMA; // SlowMAMethod input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // SlowMAPrice input int SlowMAShift = 0; // SlowMAShift input double Lots = 0.1; // Lots: input double TakeProfit = 30; // Take Profit: input double StopLoss = 10; // Stop Loss: input int Magic = 12345; // Magic Number: input int Slippage = 3; // Slippage: //+------------------------------------------------------------------+ int slipp, ticket; double point; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //----Определение пяти значного брокера point = _Point; if(_Digits == 3 || _Digits == 5) { point = 10.0 * point; slipp = Slippage * 10; } //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int OrdersSum=0; int i=0; double MA1_0,MA2_0,MA1_1,MA2_1; int total; bool resalt; MA1_0 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 0 ); // Получаем значение FastMA MA1_1 = iMA ( NULL, 0, FastMA, FastMAShift, FastMAMethod,FastMAPrice, 1 ); // Получаем значение FastMA MA2_0 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 0 ); // Получаем значение SlowMA MA2_1 = iMA ( NULL, 0, SlowMA, SlowMAShift, SlowMAMethod,SlowMAPrice, 1 ); // Получаем значение SlowMA total=OrdersTotal(); //---- buy if (total<1) { if(MA1_1<MA2_1 && MA1_0>MA2_0) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,slipp,Ask-StopLoss*point,Ask+TakeProfit*point,"",Magic,0,Blue); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер BUY : ",OrderOpenPrice()); } else { Print("Ошибка открытия BUY ордера : ",GetLastError()); return; } } //---- sell if(MA1_1>MA2_1 && MA1_0<MA2_0) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,slipp,Bid+StopLoss*point,Bid-TakeProfit*point,"",Magic,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Открыт ордер SELL : ",OrderOpenPrice()); } else { Print("Ошибка открытия SELL ордера : ",GetLastError()); return; } } } //---- for(i = OrdersTotal()-1; i >= 0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if(Bid>=(OrderOpenPrice()+TakeProfit*point)) // проверим не пора ли закрываться по профиту { resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Blue); // закрываем длинную позицию по профиту break; } if(Bid<=(OrderOpenPrice()-StopLoss*point)) // проверим не пора ли закрываться по ст.лоссу { resalt = OrderClose(OrderTicket(),OrderLots(),Bid,slipp,Blue); // закрываем длинную позицию по стопу break; } } else { if(Ask<=(OrderOpenPrice()-TakeProfit*point)) { resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по профиту break; } if(Ask>=(OrderOpenPrice()+StopLoss*point)) { resalt = OrderClose(OrderTicket(),OrderLots(),Ask,slipp,Red); // закрываем короткую позицию по стопу break; } } } return; }
total=OrdersTotal(); |
if (total<1) |
Практическое применение многомерных массивов.
Например можно в двухмерный массив Price[][4] загнать цены бара High, Low, Open, Close. В 0 измерении будут бары, а в 1 измерении 4 цены.
Этот цикл заполнит ценами последних 10 баров М1 таймфрейма.Код:double Price[10][4]; for(int i=0; i<10; i++) { Price[i][0]=iHigh(NULL,PERIOD_M1,i); Price[i][1]=iLow(NULL,PERIOD_M1,i); Price[i][2]=iOpen(NULL,PERIOD_M1,i); Price[i][3]=iClose(NULL,PERIOD_M1,i); }
Напишите скрипт, который запишет в двухмерный массив цены открытия, цены закрытия, лоты, прибыль в валюте депозита с учётом свопов и комиссий, всех исторических ордеров счёта.
После этого, напечатает в лог всё что в массиве. Построчно. Каждый ордер в отдельной строке.
В конце напечатает среднюю прибыль в валюте депозита по всем ордерам.
#property strict
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
// Напишите скрипт, который запишет в двухмерный массив цены открытия, цены закрытия, лоты,
// прибыль в валюте депозита с учётом свопов и комиссий, всех исторических ордеров счёта.
// После этого, напечатает в лог всё что в массиве. Построчно. Каждый ордер в отдельной строке.
// В конце напечатает среднюю прибыль в валюте депозита по всем ордерам.
{
double info[][4];
for(int i=0;i<OrdersHistoryTotal();i++) // считаем все исторические ордера на счете
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) // если ордер не выбран, то...
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")"); // выводим сообщение об ошибке и...
break; // прерываем подсчет ордеров
}
else
{
info[i][0]=OrderLots();
info[i][1]=AccountProfit() + OrderSwap() + OrderCommission();
info[i][2]=OrderClosePrice();
info[i][3]=OrderOpenPrice();
}
}
Print("Лот = " info[i][0] ,"Профит = " info[i][1], "Цена закрытия = " info[i][2], "Цена открытия = " info[i][3])