Менеджер API торговой платформы MT4 - получайте ценные бумаги по группам

Я использую менеджер API для торговой платформы MetaTrader 4.

Мне нужно получить ВСЕ ЦЕННЫЕ БУМАГИ на ГРУППУ

например, GROUP=preliminary|SECUTIRY_0=Forex|SECUTIRY_1=CFD|SECUTIRY_2=|

У меня есть несколько советов, как это сделать ниже:

    1. After request Securities config using CfgRequestSymbolGroup(ConSymbolGroup configurations) you got all securities.*
    1. So you got ConSymbolGroup for each security and now that configurations[0] is forex, configurations[1] is cfd and configurations[2] is metals for example.*
    1. Then request group config using CfgRequestGroup(int total) you will get ConGroup structure for each group.
    1. ConGroup has ConGroupSec secgroups[MAX_SEC_GROUPS] parameter - security group settings.*
    1. The indexes will be the same so secgroups[0] is forex settings for this group, secgroups[1] is cfd and so on.*

мой код ниже, но не может получить желаемый результат, в приведенном ниже коде я получаю список с ЦЕННЫМИ БУМАГАМИ И СПИСОК С ГРУППАМИ, но не могу получить индексы на основе описания выше, чтобы получить результат в этом формате

GROUP=preliminary|SECUTIRY_0=Forex|SECUTIRY_1=CFD|SECUTIRY_2=|

    // 1 step
    // request all securities
    // list with securities
    ConSymbolGroup securities[MAX_SEC_GROUP];

    int result = ExtManager->CfgRequestSymbolGroup(securities);

    // 2 step
    // request all groups
    // list with groups

    ConGroup *groups = ExtManager->CfgRequestGroup(&total);
    ConGroupSec secgroups[MAX_SEC_GROUPS];

    int index_secgroup = 0;
    int index_security = 0;


    for (int i = 0; i < MAX_SEC_GROUP; i++)     
        for (int i =0; i < total; i++)              
            ExtProcessor.PrintResponse(size,                    
                "GROUP=%s|"
                "SECUTIRY_0=%s|"    
                "SECUTIRY_1=%s|"
                "SECUTIRY_2=%s|\r\n",
                groups[i].group,
                securities[0].name,
                securities[1].name,
                securities[2].name);

}

person aaa    schedule 11.05.2017    source источник
comment
Хотя вы сталкиваетесь с этой проблемой при чтении данных из MT, сама проблема не связана с MetaTrader. Я настоятельно рекомендую вам изолировать его от МП (создать фиктивные классы, ссылки из одного из них в другой) и это поможет вам понять проблему, или это поможет другим людям ответить на ваш вопрос (сейчас все думают, что речь идет о МТ и пропускает его). Единственная проблема в вашем коде заключается в том, что вы используете циклы, оба из которых используют одну и ту же переменную i   -  person Uriil    schedule 11.05.2017
comment
@Uriil на самом деле это вопрос, у меня есть 1. ценные бумаги (удерживать все ценные бумаги) 2. группы (удерживать все группы) 3. secgroups (удерживать настройки безопасности для групп) -> проблема в том, что в ценных бумагах и настройках ценных бумаг нет любые общие данные, которые я могу определить, какая безопасность принадлежит к какой группе, ответ, который я получил, что мы можем идентифицировать их только по индексам, как возвращается ответ -> цикл for, как сделать это правильно, у меня есть все необходимые данные, единственное осталось использовать индекс безопасности и индекс секгруппы, чтобы определить, к какой группе они принадлежат, не могли бы вы помочь с циклом for?   -  person aaa    schedule 11.05.2017
comment
Хорошо, допустим, у вас есть две группы, в одной из которых есть FOREX и CFD, а во второй FOREX и METALS. Что должно быть на выходе?   -  person Uriil    schedule 11.05.2017
comment
@Uriil вывод, который мне нужен, будет следующим: METALS, так же таким образом для каждой строки мы можем добавить все настройки для каждой ценной бумаги из группы с помощью secgroups[MAX_SEC_GROUPS] GROUP1=preliminary|SECUTIRY=CFD|SETTINGS1=aaa|SETTINGS2=ddd| и так далее (новая строка)   -  person aaa    schedule 12.05.2017


Ответы (1)


Вот фрагмент кода, который предоставит вам необходимые данные, чтобы вы могли выводить их по мере необходимости:

ConSymbolGroup sgconfigurations[MAX_SEC_GROUP];
_manager->Manager->CfgRequestSymbolGroup(sgconfigurations);

int total = 0;
ConGroup* result = _manager->Manager->CfgRequestGroup(&total);

for (int i = 0; i < total; i++)
{
    for (int j = 0; j < MAX_SEC_GROUP; j++) {
        if (result[i].secgroups[j].show == 1 && sgconfigurations[j].name != NULL && sgconfigurations[j].name[0] != '\0') {
            char* groupName = result[i].group;
            char* securityName = sgconfigurations[j].name;
        }
    }
}
person Uriil    schedule 12.05.2017
comment
спасибо, кажется, работает правильно, я вижу, что sgconfigurations[j].name в моем результате во многих местах является emhpy, можем ли мы фильтровать, чтобы не отображать emhpy один раз? потому что enow получает правильный результат, но с большим количеством ценных бумаг - person aaa; 12.05.2017
comment
Я подозреваю, что result[i].secgroups[j].show == 1 должен выполнить эту работу и скрыть неиспользуемые секунды. Однако я могу ошибаться - person Uriil; 12.05.2017
comment
теперь ответ такой: ГРУППА=WLD-STD-1-USD|БЕЗОПАСНОСТЬ=DEMO-Forex| ГРУППА=WLD-STD-1-USD|БЕЗОПАСНОСТЬ=| ГРУППА=WLD-STD-1-USD|БЕЗОПАСНОСТЬ=ДЕМО-CFD| ГРУППА=WLD-STD-1-USD|БЕЗОПАСНОСТЬ=| ГРУППА=WLD-STD-1-USD|БЕЗОПАСНОСТЬ=| GROUP=WLD-STD-1-USD|SECURITY=|, если вы можете отфильтровать эту SECURITY=| когда emphy будет идеальным - person aaa; 12.05.2017
comment
@ionluchian, в чем проблема просто проверить, пусто ли оно, и пропустить его в этом случае? - person Uriil; 12.05.2017
comment
Могу ли я получить из петли тип безопасности? например char* securityType = fx или cfd или металлы и т.д.? @Уриил - person aaa; 12.05.2017
comment
@ionluchian Что вы подразумеваете под типом безопасности? На этом объекте нет такого свойства. - person Uriil; 12.05.2017
comment
да я видел что типа нет, метакавычки сказали что по индексам мы можем их идентифицировать как security sgconfigurations[0] is FX sgconfigurations[1] is CDF sgconfigurations[3] is METALS и т.д-> можно как-то назначить этот тип безопасности? @Уриил - person aaa; 12.05.2017
comment
Это не типы, это группы символов. И вы можете настроить их с помощью администратора MT4 на специальной вкладке. - person Uriil; 12.05.2017
comment
Спасибо за информацию, значит на вкладке первая безопасность это FX, вторая CFD, верно? Если правильно то, что я сказал, можем ли мы назначить в списке позицию безопасности, чтобы знать, например, что группа 1 имеет безопасность a1 и b1, и a1 находится на первой позиции, а b1 находится на второй позиции, и в ответ мы можем что-то сделать как int* securityPosition = здесь позиция ценной бумаги? @Уриил - person aaa; 12.05.2017
comment
теперь я автоматизирую группы, инструменты и ценные бумаги из mt4 со всеми наценками, и теперь мне сложно назначить ценные бумаги на группу, что уже помогло мне, но напомнил, чтобы определить, на какой позиции находится ценная бумага, чтобы назначить эту ценную бумагу это FX, CFD и т. д., потому что на основе этого я проверю тип инструмента и проверю наценки для различных расчетов @Uriil - person aaa; 12.05.2017
comment
@ionluchian Ты немного не прав. Во-первых, это не обязательно Forex, это определяется конфигурацией SymbolGroup. - person Uriil; 12.05.2017
comment
я немного запутался в отношении ценных бумаг, поэтому в этом случае приведенный выше код является правильной безопасностью для каждой группы, вы сказали, что она определяется SymbolGroup, поэтому для того, чтобы определить, например, какой безопасностью является a1, мы также должны зацикливаться в SymbolGroup? Что у меня есть 1. Список групп, запрошенных RequestGroup() 2. список инструментов, запрошенных SymbolsRefresh() и SymbolsGetAll() 3. и теперь из вашего кода у меня есть список ценных бумаг. Вопрос в том, что SymbolsGetAll() имеет тип FX, CFD и т. д., как я могу определить, что это за ценные бумаги? Моя цель — связать ценные бумаги с помощью FX или CFD и т. д. @Uriil - person aaa; 13.05.2017
comment
Не могли бы вы исправить оператор if, чтобы пропустить пустые ценные бумаги? @Уриил - person aaa; 13.05.2017
comment
Давайте продолжим обсуждение в чате. - person Uriil; 13.05.2017