Реклама

Ввод кода в проект через окно проекта

Здравствуйте.

Можно в QT вводить код через виджет и выполнять измененные методы?
  • #
  • 1 декабря 2017 г. 7:49

Добрый день.
Вы хотите выполнять измененные методы какие? В каком коде?

Изменения расчета. Изменения примерно в таком методе

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
void MainWindow::StrategyCod() //код стратегии
{
  for (int NMA=5;NMA<1000;NMA=NMA+50)//3-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  {
      //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      int NOpenPosition=0; //число открытых позиций
      double Profit=0;
      double PriceEnter,PriceExit; //цена входа и выхода
      QDate DateOpenPosition; //Дата открытия позиции
      //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    //int NMA=20;//период ma
    QVector<double> SMA(NBar); //ma
    for(long long bar = NMA; bar <NBar; bar++) //ma
    {
        double Summa=0;//summa
        for(long long i=bar-NMA;i<bar;i++)//summa
        {
            Summa=Summa+Close[i];
        }
        SMA[bar]=Summa/NMA;
    }
 
 
    for(long long bar = NMA; bar <NBar; bar++)//основной цикл
    {
     if (NOpenPosition!=0)//2-------------------------------------------------------------------------------------------------------------------------------------------------------
         {
             if ((Close[bar-1]<SMA[bar-1])&&(Close[bar]>SMA[bar]))
             {
                 PriceExit=Close[bar]-qrand()%MaxSlippage; //цена закрытия позиции
                 if (PriceEnter>High[bar]){PriceEnter=High[bar];}
                 if (PriceEnter<Low[bar]){PriceEnter=Low[bar];}
                 NOpenPosition=NOpenPosition-1;
                 Profit=PriceEnter-PriceExit-Commission;
             }
         }
     else//1--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
         {
             if ((Close[bar-1]>SMA[bar-1])&&(Close[bar]<SMA[bar]))
             {
                 PriceEnter=Close[bar]+qrand()%MaxSlippage; //цена открытия позиции  //покупка
                 if (PriceEnter>High[bar]){PriceEnter=High[bar];}
                 if (PriceEnter<Low[bar]){PriceEnter=Low[bar];}
                 NOpenPosition=NOpenPosition+1;
                 DateOpenPosition=Date[bar];
             }
         }
     //1---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    }//2------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
qDebug()<<NMA;
qDebug()<<Profit;
qDebug()<<QDateTime::currentDateTime();
  }//3------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
}

C++ - это компилируемый язык, а не интерпретируемый. Его не получится выполнять в качестве скрипта в рамках программы.

Но то что вы хотите сделать возможно в рамках Qt. Сам я не такого не делал, но функционал имеется.
Qt имеет функционал по интерпретации JavaScript, то есть фактически можно выполнять как JavaScript, который будет выполнять определённый расчеты, а также даже создавать объекты в рамках программы. Но проблема в том, что это тема ещё более сложная, чем построение графиков.

Насколько знаю, за такой функционал отвечает QJSEngine в Qt .

Еще как вариант, создание библиотеки. Я создал в QT проект библиотеке и в срр написал

StrategyCod::StrategyCod()
{
    qDebug()<<"Проверка работы";
}
Скажите пожалуйста, что делать дальше с этим проектом? Как его превратить в библиотеку? И как потом корректировать эту библиотеку?
  • Миша
  • #
  • отредактировано 4 декабря 2017 г. 8:01
  • 4 декабря 2017 г. 8:00

Какое создание библиотеки? Я же вам сказал, что C++ - это компилируемый язык. Если даже Вы будете делать вашу стратегию как библиотеку, то Вам придётся тогда при каждой смене менять dll библиотеки в программе. А корректировать придётся точно также, через среду разработки и никак иначе.

Ваше конечно право... Но звучит довольно непрактично...

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

И как потом корректировать эту библиотеку?
Вручную в среде разработки, то есть в Qt Creator`e

Я подключил библиотеку так

QLibrary MyLib("C:\\Qt\project\\StrategyCod\\StrategyCod.pro");
    MyLib.load();
Скажите пожалуйста, как мне воспользоваться функцией StrategyCod::StrategyCod() ?

Нужно пометить эту функцию как экспортируемую.

А вообще, есть вполне стандартные средства для подключения динамических библиотек.
Сделайте для начала просто какой-нибудь проект в виде библиотеки. Там будет файл *_global.h в котором будет макрос, чтобы помечать методы и файлы как экспортируемые. Тогда их можно будет применять в рамках других проектов и библиотек.

У меня такой есть, вот его содержимое.

#ifndef STRATEGYCOD_GLOBAL_H
#define STRATEGYCOD_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(STRATEGYCOD_LIBRARY)
#  define STRATEGYCODSHARED_EXPORT Q_DECL_EXPORT
#else
#  define STRATEGYCODSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // STRATEGYCOD_GLOBAL_H

Скажите пожалуйста, как в нем пометить мою функцию?

У вас функция является методом класса, поэтому нужно пометить просто сам класс.

class STRATEGYCODSHARED_EXPORT StrategyCod 
{

}
Тогда этот класс будет доступен в других проектах при подключении данного проекта как библиотеки.

У меня уже написано так в хедере класса

class STRATEGYCODSHARED_EXPORT StrategyCod
{

public:
    StrategyCod();
};

#endif // STRATEGYCOD_H
Но как воспользоваться этой функцией в проекте?
  • Миша
  • #
  • отредактировано 4 декабря 2017 г. 10:19
  • 4 декабря 2017 г. 10:19

Тогда написать сигнатуру функции и вызвать её через метод resolve .

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

QLibrary MyLib("C:\\Qt\project\\StrategyCod\\StrategyCod.pro"); 
    typedef void (*MyPrototype)();
    MyPrototype myFunction = (MyPrototype) MyLib.resolve("StrategyCod");
    myFunction();

Вместо файла про в пути указал файл длл, но то же не работает

оказалось что функцию вне класса оно считывает из библиотеки хорошо

При использовании класса из библиотеки нельзя использовать отдельно его метод. Если только это не статический метод класса. Но в данном случае нужно обращаться к методу через имя класса.

Спасибо

Реклама

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • JaJay
  • 17 декабря 2017 г. 5:16

C++ - Тест 002. Константы

  • Результат 58 баллов
  • Очки рейтинга -2
  • JaJay
  • 17 декабря 2017 г. 4:55

C++ - Тест 001. Первая программа и типы данных

  • Результат 93 баллов
  • Очки рейтинга 8
  • JaJay
  • 17 декабря 2017 г. 4:48

C++ - Тест 001. Первая программа и типы данных

  • Результат 66 баллов
  • Очки рейтинга -1
Последние комментарии
  • EVILEG
  • 7 декабря 2017 г. 9:47

Django - Урок 011. Добавление комментариев на сайт с Django

Визуальный пример чего? комментариев? При ответе на конкретный комментарий рядом с ником отвечающего будет стрелочка и указание ник другого пользователя. Который будет ссылкой на коммента...

  • Bernar
  • 7 декабря 2017 г. 9:24

Django - Урок 011. Добавление комментариев на сайт с Django

есть визуальный пример ?

  • EVILEG
  • 6 декабря 2017 г. 11:30

Django - Урок 011. Добавление комментариев на сайт с Django

Да, так будет даже лучше, я на сайте уже обновил до такого вида код Вот это уже не нужно if request.method == 'POST': Поскольку Вы и так используете метод post, то есть эта про...

  • Bernar
  • 6 декабря 2017 г. 11:19

Django - Урок 011. Добавление комментариев на сайт с Django

сделал немного по другому class EArticleView(View): template_name = 'knowledge/article.html' comment_form = CommentForm def get(self, request, *args, **kwargs): ...

Сейчас обсуждают на форуме
  • EVILEG
  • 16 декабря 2017 г. 17:23

Пауза в многопоточности

QFuture, который возвращается QtConcurrent::map имеет методы pause() и resume() и теоретически должен поддерживать этот функционал. Но для Qt...

  • Миша
  • 15 декабря 2017 г. 11:26

Как найти в QVector макс и мин

Спасибо

  • Galant
  • 14 декабря 2017 г. 19:58

LPT

Понял! Спасибо!

  • EVILEG
  • 14 декабря 2017 г. 13:38

QCustomPlot можно ли построить прерывистую линию на одном графике?

Во-первых: В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL DEFINES += QCUSTOMPLOT_USE_OPENGL И во вторых:...

  • EVILEG
  • 13 декабря 2017 г. 8:05

В многопоточности выполнять действие только в одном из потоков

Статическиe методs QThread::currentThread(); и QThread::currentThreadId() могут возвращать указатель на поток и его handle id соответственно. Можете попробовать через как...