Скрипт должен выводить на экран информацию о том, какой путь был пройден ценой за прошлую неделю, т.е. рассчитывать растояние от Close до Open недельной свечи по семи мажорным валютным парам, а именно: AUDUSD, EURUSD, GBPUSD, NZDUSD, USDCHF, USDCAD, USDJPY.
При этом, нужно чтобы выводилась информация о том, какая валютная пара была рекордсменом по пройденному пути ценой, а также само значение в пунктах, пройденное ценой. Нам, также, нужно предусмотреть возможность отличия в наименовании инструментов от классических, заключающуюся в том, что иногда брокеры добавляют символ (постфикс) после наименования торгового инструмента, например, EURUSDc, EURUSDm и т.п.
Итак, приступим.
Прежде всего, определим в скрипте семь массивов для хранения различной информации:
- Код: выделить все
string strMSym[N]; // массив символов
double dblMOpe[N]; // массив цен открытия
double dblMClo[N]; // массив цен закрытия
int intMDeY[N]; // массив разности цены открытия и закрытия
int intMDeM[N]; // массив модулей разности цены открытия и закрытия
double dblPoin[N];
int intDigi[N];
strMSym[N] - массив наименования торговых пар;
dblMOpe[N] - массив цен открытия недельных свеч;
dblMClo[N] - массив цен закрытия недельных свеч;
Для определения пройденного пути ценой за неделю нам понадобятся массивы:
intMDeY[N] - массив разности цены открытия и закрытия;
intMDeM[N] - массив модулей разности цены открытия и закрытия.
Также нужны будут два массива для хранения рыночной информации о семи валютных пар:
dblPoin[N] - массив величин торговых пунктов;
intDigi[N] - массив количества цифр в валютных парах.
Количество символов в массивах можно специфицировать:
- Код: выделить все
#define N 7
Нам понадобятся три функции для работы скрипта, которые напишем.
1. Функция для инициализации массива торговых символов. Фактически, мы просто заносим классические наименования торговых инстументов в массив strMSym[].
- Код: выделить все
void f_ItitSymbol()
{
strMSym[0] = "AUDUSD"; strMSym[1] = "EURUSD"; strMSym[2] = "GBPUSD"; strMSym[3] = "NZDUSD";
strMSym[4] = "USDCHF"; strMSym[5] = "USDCAD"; strMSym[6] = "USDJPY";
}
2. Данная функция осуществляет модификацию классического наименования торгового инструмента с учетом постфикса, если требуется:
- Код: выделить все
void f_AddPostfix(string pos)
{
if(pos != "")
{
for(int i = 0; i < N; i++) { strMSym[i] += pos; }
}
}
3. Основная функция для получения рыночной информации и осуществления расчетов f_GetData():
- Код: выделить все
void f_GetData()
{
for(int i = 0; i < N; i++)
{
dblMOpe[i] = iOpen (strMSym[i], PERIOD_W1, 1);
dblMClo[i] = iClose(strMSym[i], PERIOD_W1, 1);
dblPoin[i] = MarketInfo(strMSym[i], MODE_POINT);
intDigi[i] = (int) MarketInfo(strMSym[i], MODE_DIGITS);
// находим разницу между ценой закрытия и открытия (пнт):
intMDeY[i] = (int) ((dblMClo[i] - dblMOpe[i]) / dblPoin[i]);
intMDeM[i] = MathAbs(intMDeY[i]);
}
}
В ней мы заполняем массивы цен открытия и закрытия недельных свечей, производим расчет разностных массивов и определяем величину в пунктах пройденную ценой.
Рассмотрим тело функции OnStart():
- Код: выделить все
void OnStart()
{
f_ItitSymbol();
f_AddPostfix(strPoS);
f_GetData();
int intJmax = ArrayMaximum(intMDeM, WHOLE_ARRAY, 0);
int intYmax = intMDeY[intJmax];
if(intYmax >= 0) { strDir = "UP"; }
else if(intYmax < 0) { strDir = "DN"; }
// пара с наибольшим проходом за неделю:
string strSym = strMSym[intJmax];
Comment( "\n", "Размер прошлой недельной свечи (пнт.): ",
"\n", strMSym[0]," = ", intMDeY[0],
"\n", strMSym[1]," = ", intMDeY[1],
"\n", strMSym[2]," = ", intMDeY[2],
"\n", strMSym[3]," = ", intMDeY[3],
"\n", strMSym[4]," = ", intMDeY[4],
"\n", strMSym[5]," = ", intMDeY[5],
"\n", strMSym[6]," = ", intMDeY[6],
"\n", "------------------------",
"\n", "Ymax = ", intYmax,
"\n", "Sym = ", strSym);
}
В ней мы вызываем три описанные выше рабочие функции, потом находим максимум в массиве модулей (нам нужно найти наибольшее расстояние, которое прошла цена, т.е. знак движения цены (рост или падение) мы не должны учитывать). Одновременно с номером индекса в массиве для найденной валютной пары мы извлекаем нужное значение в пунктах.
Далее определяем направление недельной свечи (т.е. была она растущей или падающей). Это понадобится в дальнейшем при расширении возможностей скрипта.
И в конце-концов, осуществляем вывод полученной информации и расчетов на экран, в терминале окна торгового инструмента:
- Код: выделить все
Comment( "\n", "Размер прошлой недельной свечи (пнт.): ",
"\n", strMSym[0]," = ", intMDeY[0],
"\n", strMSym[1]," = ", intMDeY[1],
"\n", strMSym[2]," = ", intMDeY[2],
"\n", strMSym[3]," = ", intMDeY[3],
"\n", strMSym[4]," = ", intMDeY[4],
"\n", strMSym[5]," = ", intMDeY[5],
"\n", strMSym[6]," = ", intMDeY[6],
"\n", "------------------------",
"\n", "Ymax = ", intYmax,
"\n", "Sym = ", strSym);
Пример работы скрипта:
Видно, что за прошлую неделю самый большой путь прошла цена по паре AUDUSD, в значении 1768 пнт.
Сам скрипт будет выложен позже в соответствующем разделе форума. В качестве расширения функционала скрипта можно предусмотреть фактическое осуществление торговой операции по результатам полученных расчетов.
Файл скрипта выложен в теме Скрипт "Мажорный Ва-Банк".