예제 #1
1
//---------------------------------------------------------------------------
void __fastcall TGUIConfiguration::LoadData(THierarchicalStorage * Storage)
{
  TConfiguration::LoadData(Storage);

  // duplicated from core\configuration.cpp
  #define KEYEX(TYPE, VAR, NAME) VAR = Storage->Read ## TYPE(NAME, VAR)
  #pragma warn -eas
  REGCONFIG(false);
  #pragma warn +eas
  #undef KEYEX

  if (Storage->OpenSubKey(L"Interface\\CopyParam", false, true))
  try
  {
    // must be loaded before eventual setting defaults for CopyParamList
    FDefaultCopyParam.Load(Storage);

    int CopyParamListCount = Storage->ReadInteger(L"CopyParamList", -1);
    FCopyParamListDefaults = (CopyParamListCount < 0);
    if (!FCopyParamListDefaults)
    {
      FCopyParamList->Clear();
      FCopyParamList->Load(Storage, CopyParamListCount);
    }
    else if (FCopyParamList->Modified)
    {
      FCopyParamList->Clear();
      FCopyParamListDefaults = false;
    }
    FCopyParamList->Reset();
  }
  __finally
  {
    Storage->CloseSubKey();
  }

  // Make it compatible with versions prior to 3.7.1 that have not saved PuttyPath
  // with quotes. First check for absence of quotes.
  // Add quotes either if the path is set to default putty path (even if it does
  // not exists) or when the path points to existing file (so there are no parameters
  // yet in the string). Note that FileExists may display error dialog, but as
  // it should be called only for custom users path, let's expect that the user
  // can take care of it.
  if ((FPuttyPath.SubString(1, 1) != L"\"") &&
      (CompareFileName(ExpandEnvironmentVariables(FPuttyPath), FDefaultPuttyPathOnly) ||
       FileExists(ExpandEnvironmentVariables(FPuttyPath))))
  {
    FPuttyPath = FormatCommand(FPuttyPath, L"");
  }

  if (Storage->OpenSubKey(L"Interface\\NewDirectory2", false, true))
  try
  {
    FNewDirectoryProperties.Load(Storage);
  }
  __finally
  {
    Storage->CloseSubKey();
  }
}
예제 #2
0
void TFarConfiguration::Default()
{
  TGUIConfiguration::Default();

  FForceInheritance = false;
  FConfirmOverwritingOverride = false;
  FConfirmSynchronizedBrowsing = true;

  SetDisksMenu(true);
  SetDisksMenuHotKey(0);
  SetPluginsMenu(true);
  SetPluginsMenuCommands(true);
  SetCommandPrefixes("netbox,ftp,scp,sftp,ftps,http,https,webdav");
  SetHostNameInTitle(true);
  SetEditorDownloadDefaultMode(true);
  SetEditorUploadSameOptions(true);
  FEditorUploadOnSave = true;
  FEditorMultiple = false;
  FQueueBeep = true;

  SetCustomPanelModeDetailed(true);
  SetFullScreenDetailed(true);
  SetColumnTypesDetailed("N,S,DM,O,G,R");
  SetColumnWidthsDetailed("0,8,14,0,0,9");
  SetStatusColumnTypesDetailed("NR");
  SetStatusColumnWidthsDetailed("0");

  SetApplyCommandCommand(L"");
  SetApplyCommandParams(0);

  SetPuttygenPath(FormatCommand(::ExtractFilePath(ModuleFileName()) + "putty\\puttygen.exe", L""));
  SetPageantPath(FormatCommand(::ExtractFilePath(ModuleFileName()) + "putty\\pageant.exe", L""));

  FBookmarks->Clear();
}
예제 #3
0
//---------------------------------------------------------------------------
void __fastcall TCustomWinConfiguration::DefaultHistory()
{
  ClearHistory();

  std::unique_ptr<THistoryStrings> Strings;

  // Defaults for speed limits.
  Strings.reset(new THistoryStrings());
  // This is language-specifics, what has to be dealt with when changing language.
  // There's ad-hoc workaround in CopySpeedLimits.
  // If we need to solve this for another history, we should introduce
  // a generic solution, like language-specific history ("SpeedLimitEN")
  Strings->Add(LoadStr(SPEED_UNLIMITED));
  unsigned long Speed = 8192;
  while (Speed >= 8)
  {
    Strings->Add(IntToStr(int(Speed)));
    Speed = Speed / 2;
  }
  FHistory->AddObject(L"SpeedLimit", Strings.release());

  Strings.reset(new THistoryStrings());
  Strings->Add(FormatCommand(DefaultPuttyPath, L""));
  Strings->Add(FormatCommand(DefaultPuttyPath, L"-t -m \"%TEMP%\\putty.txt\" !`cmd.exe /c echo cd '!/' ; /bin/bash -login > \"%TEMP%\\putty.txt\"`"));
  Strings->Add(KittyExecutable);
  Strings->Add(FORMAT(L"%s -cmd \"cd '!/'\" !U@!@ -P !# -title \"!N\"", (KittyExecutable)));
  FHistory->AddObject(L"PuttyPath", Strings.release());
}
예제 #4
0
void __fastcall BrowseForExecutableT(T * Control, UnicodeString Title,
  UnicodeString Filter, bool FileNameCommand, bool Escape)
{
  UnicodeString Executable, Program, Params, Dir;
  Executable = Control->Text;
  if (FileNameCommand)
  {
    ReformatFileNameCommand(Executable);
  }
  SplitCommand(Executable, Program, Params, Dir);

  TOpenDialog * FileDialog = new TOpenDialog(Application);
  try
  {
    if (Escape)
    {
      Program = ReplaceStr(Program, L"\\\\", L"\\");
    }
    UnicodeString ExpandedProgram = ExpandEnvironmentVariables(Program);
    FileDialog->FileName = ExpandedProgram;
    UnicodeString InitialDir = ExtractFilePath(ExpandedProgram);
    if (!InitialDir.IsEmpty())
    {
      FileDialog->InitialDir = InitialDir;
    }
    FileDialog->Filter = Filter;
    FileDialog->Title = Title;

    if (FileDialog->Execute())
    {
      TNotifyEvent PrevOnChange = Control->OnChange;
      Control->OnChange = NULL;
      try
      {
        // preserve unexpanded file, if the destination has not changed actually
        if (!CompareFileName(ExpandedProgram, FileDialog->FileName))
        {
          Program = FileDialog->FileName;
          if (Escape)
          {
            Program = ReplaceStr(Program, L"\\", L"\\\\");
          }
        }
        Control->Text = FormatCommand(Program, Params);
      }
      __finally
      {
        Control->OnChange = PrevOnChange;
      }

      if (Control->OnExit != NULL)
      {
        Control->OnExit(Control);
      }
    }
  }
예제 #5
0
//---------------------------------------------------------------------------
void __fastcall TGUIConfiguration::Default()
{
  TConfiguration::Default();

  // reset before call to DefaultLocalized()
  FDefaultCopyParam.Default();

  FCopyParamListDefaults = true;
  DefaultLocalized();

  FIgnoreCancelBeforeFinish = TDateTime(0, 0, 3, 0);
  FContinueOnError = false;
  FConfirmCommandSession = true;
  FSynchronizeParams = TTerminal::spNoConfirmation | TTerminal::spPreviewChanges;
  FSynchronizeModeAuto = -1;
  FSynchronizeMode = TTerminal::smRemote;
  FMaxWatchDirectories = 500;
  FSynchronizeOptions = soRecurse | soSynchronizeAsk;
  FQueueTransfersLimit = 2;
  FQueueKeepDoneItems = true;
  FQueueKeepDoneItemsFor = 15;
  FQueueAutoPopup = true;
  FSessionRememberPassword = false;
  UnicodeString ProgramsFolder;
  SpecialFolderLocation(CSIDL_PROGRAM_FILES, ProgramsFolder);
  FDefaultPuttyPathOnly = IncludeTrailingBackslash(ProgramsFolder) + L"PuTTY\\" + OriginalPuttyExecutable;
  FDefaultPuttyPath = L"%PROGRAMFILES%\\PuTTY\\" + OriginalPuttyExecutable;
  FPuttyPath = FormatCommand(FDefaultPuttyPath, L"");
  PSftpPath = FormatCommand(L"%PROGRAMFILES%\\PuTTY\\psftp.exe", L"");
  FPuttyPassword = false;
  FTelnetForFtpInPutty = true;
  FPuttySession = L"WinSCP temporary session";
  FBeepOnFinish = false;
  FBeepOnFinishAfter = TDateTime(0, 0, 30, 0);
  FCopyParamCurrent = L"";
  FKeepUpToDateChangeDelay = 500;
  FChecksumAlg = L"md5";
  FSessionReopenAutoIdle = 9000;

  FNewDirectoryProperties.Default();
  FNewDirectoryProperties.Rights = TRights::rfDefault | TRights::rfExec;
}
예제 #6
0
/*
returns: FALSE - request should be deleted, TRUE - keep request
*/
int CProcessor::ProcessSingleRequest(Request *req)
{
    UserInfo   user = {0};
    ConGroup   group = {0};
    double     prices[2];
    CharString str, strMsg;
    char       strCmd[64], strType[64];

    user.login = m_manager;
    COPY_STR(user.name, "Virtual Dealer");
    COPY_STR(user.ip,   "VirtualDealer");

    ExtServer->GroupsGet(req->group, &group);
    // получим текущие цены для группы и установки символа
    if (ExtServer->HistoryPricesGroup(req->trans.symbol, &group, prices) != RET_OK)
    {
        ExtServer->RequestsReset(req->id, &user, DC_RESETED);
        str.Printf(FALSE, "ProcessSingleRequest: HistoryPricesGroup (symbol [%s],  group [%s]) failed", req->trans.symbol, req->group);
        ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());
        return FALSE;
    }

    // если это запрос на открытие позы...
    if (req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_IE_CLOSE
            || req->trans.type == TT_ORDER_MK_OPEN || req->trans.type == TT_ORDER_MK_CLOSE)
    {
        // запрос был отправлен, ответа нет - таймаут
        if (req->sent && (GetTickCount() > req->time + m_waitForFXIReply))
        {
            str.Printf(FALSE, "Таймаут для запроса %d (нет ответа от сервера FXI)", req->id);
            ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());
            // !! добавить открытие сделки (отложенное)
            ExtServer->RequestsRequote(req->id, &user, prices, FALSE);
            return FALSE;
        }

        // запрос к FXI еще не был отправлен - отправить
        if (!req->sent)
        {
            ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отправка UDP");
            CharString reqStr;
            reqStr.Printf(FALSE, "requestId=%d;group=%s;time=%d;login=%d;", req->id, req->group, req->time, req->login);

            reqStr.Printf(TRUE, "type=%s;side=%d;order=%d;orderby=%d;price=%g;symbol=%s;volume=%d;tp=%g;sl=%g;slippage=%d;pending=%d;stopout=%d",
                          req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_MK_OPEN
                          ? "OPEN" : "CLOSE",
                          req->trans.cmd == OP_BUY || req->trans.cmd == OP_BUY_LIMIT || req->trans.cmd == OP_BUY_STOP
                          ? FXI_OP_BUY : FXI_OP_SELL,
                          req->trans.order, req->trans.orderby,
                          req->trans.price, req->trans.symbol, req->trans.volume,
                          req->trans.tp, req->trans.sl, req->trans.ie_deviation, req->isPending, req->isStopout);

            FormatCommand(req->trans.cmd, strCmd);
            FormatRequestType(req->trans.type, strType);
            str.Printf(FALSE, "Отправка запроса FXI [%s] типа [%s] по цене [%g], ордер [%d]",
                       strCmd, strType, req->trans.price, req->trans.order);
            ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());

            m_sender->SendTo(&reqStr, m_sendHost, m_sendPort);
            req->sent = TRUE;
            ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отправка UDP::OK");
            return TRUE;
        }

        Response resp = { 0 };
        int requestId = req->trans.type == TT_ORDER_MK_CLOSE || req->trans.type == TT_ORDER_IE_CLOSE ?
                        req->trans.order : req->id;
        int respFound = extQueue->FindAndDequeue(requestId, &resp);

        if (!respFound) return TRUE;

        // получен ответ от FXI
        ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Обработка ответа FXI");

        // обработан успешно
        if (resp.status == RequestCompleted)
        {
            strMsg.Printf(FALSE,
                          "Запрос (%d) подтвержден по цене (%g), сейчас цена (%g)",
                          req->id,
                          req->trans.cmd == OP_BUY ? prices[1] : prices[0],
                          resp.price);
            ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, strMsg.ToArray());
            double    newPrices[2] = { resp.price, resp.price };
            req->trans.price = resp.price;

            // отложенный ордер
            if (resp.isPendingActivate)
            {
                ActivatePendingOrder(&resp);
                return FALSE;
            }

            // обработка ответа на закрытие (стопаут)
            if (resp.isStopoutReply)
            {
                ClosePositionStopout(&resp, req);
                return FALSE;
            }

            // обычный ордер
            // подтвердить запрос
            if (ExtServer->RequestsConfirm(req->id, &user, newPrices) == RET_OK)
            {
                // если запрос на открытие...
                if (req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_MK_OPEN)
                    // сохранить подтвержденный запрос (потом ассоциировать его с открывшейся
                    // позицией)
                    extPendingRequestQueue.AddRequest(resp.requestId, req->login,
                                                      req->trans.cmd, req->trans.symbol, req->trans.volume, resp.price);
            }
            else
            {   // сделка открыта у брокера, но не открылась в МТ4

            }
            return FALSE;
        }
        // обработан с ошибкой
        if (resp.status == RequestFailed)
        {
            ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Запрос не подтвержден (отрицательная квитанция)");
            ExtServer->RequestsReset(req->id, &user, DC_RESETED);
            return FALSE;
        }
        // прочие возвраты
        strMsg.Printf(FALSE, "Запрос: код ответа [%d]", resp.status);
        ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, strMsg.ToArray());

        return FALSE;
    } // if (req->trans.type == TT_ORDER_IE_OPEN ...

    // запрос цены, не более
    if (req->trans.type == TT_PRICES_GET)
    {
        ExtServer->RequestsPrices(req->id, &user, prices, FALSE);
        return FALSE;
    }

    if (req->trans.type == TT_ORDER_DELETE)
    {
        ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Удаление отложенного ордера");
        ExtServer->RequestsConfirm(req->id, &user, prices);
        ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отложенный ордер удален");
        return FALSE;
    }

    // остальные запросы подтверждаем
    ExtServer->RequestsConfirm(req->id, &user, prices);

    return FALSE;
}
예제 #7
0
int CProcessor::Add(const UserInfo *user, const ConGroup *group, const ConSymbol *symbol,
                    const TradeRecord *pending, TradeRecord *trade)
{
    Request *temp;
    UINT     id;
    static int uid = 1;
    CharString str;

    if (pending == NULL || trade == NULL) return(FALSE);
    // проверки - кто управляет счетом
    if (m_delay == 0 || CheckGroup(m_groups, group->group) == FALSE)
        return (TRUE);

    double    prices[2];
    // получим текущие цены для группы и установки символа
    if (ExtServer->HistoryPricesGroup(symbol->symbol, group, prices) != RET_OK)
    {
        str.Printf(FALSE, "CProcessor::Add Pending (symbol [%s], group [%s]) failed", symbol->symbol, group->group);
        ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());
        return FALSE;
    }

    m_sync.Lock();

    // проверить - нет ли такого запроса в списке
    Request  *reqTmp;
    if (m_requests != NULL)
    {
        int i = 0;
        for (reqTmp = m_requests; i < m_requests_total; i++, reqTmp++)
        {
            if (reqTmp->isPending)
                if (reqTmp->pendingId == pending->order)
                {
                    ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отложенный ордер уже в списке");
                    m_sync.Unlock();
                    return (TRUE);
                }
        }
    }

    // лог
    /*char reqCmdStr[64];
    FormatCommand(pending->cmd, reqCmdStr);
    str.Printf(FALSE, "CProcessor::Add Pending(order [%d], cmd [%s], req Id [%d])",
    	pending->order, reqCmdStr, startPendingRequestId);
    ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());*/


    //---- если место для запросов нет выделим
    if(m_requests == NULL)
    {
        if((m_requests = new Request[256]) == NULL)
        {
            m_sync.Unlock();
            return (FALSE);
        }
        m_requests_max = 256;
        m_requests_total = 0;
    }
    //---- посмотрим может надо перевыделить
    if (m_requests_total >= m_requests_max)
    {
        if((temp = new Request[m_requests_max + 256]) == NULL)
        {
            m_sync.Unlock();
            return(FALSE);
        }
        //---- скопируем старое
        memcpy(temp, m_requests, sizeof(Request) * m_requests_total);
        //---- удалим уже не нужное
        delete m_requests;

        m_requests = temp;
        m_requests_max += 256;
    }
    //---- вставляем запрос
    m_requests[m_requests_total].pendingId = pending->order;
    m_requests[m_requests_total].isPending = TRUE;
    m_requests[m_requests_total].id = startPendingRequestId++;
    m_requests[m_requests_total].time = GetTickCount();
    m_requests[m_requests_total].sent = FALSE;
    m_requests[m_requests_total].login = user->login;
    memcpy(&m_requests[m_requests_total].trans, pending, sizeof(TradeTransInfo));
    m_requests[m_requests_total].trans.volume = trade->volume;
    Out(CmdOK, "Pending order %d added of volume %d",
        m_requests[m_requests_total].id, trade->volume);
    COPY_STR(m_requests[m_requests_total].group, group->group);
    // поправить команду
    char origTradeCmd[32], newTradeCmd[32];
    FormatCommand(m_requests[m_requests_total].trans.cmd, origTradeCmd);

    int pendCmd = trade->cmd; //m_requests[m_requests_total].trans.cmd;
    pendCmd = (pendCmd == OP_BUY_LIMIT || pendCmd == OP_BUY_STOP) ? OP_BUY
              : (pendCmd == OP_SELL_LIMIT || pendCmd == OP_SELL_STOP) ? OP_SELL
              : pendCmd;
    m_requests[m_requests_total].trans.cmd = pendCmd;
    FormatCommand(m_requests[m_requests_total].trans.cmd, newTradeCmd);

    m_requests[m_requests_total].trans.type = TT_ORDER_MK_OPEN;
    m_requests[m_requests_total].trans.price = pendCmd == OP_BUY ? prices[1] : prices[0];
    strcpy(m_requests[m_requests_total].trans.symbol, symbol->symbol);
    m_requests[m_requests_total].trans.order = pending->order;

    str.Printf(FALSE, "Отложенный ордер %d добавлен, всего %d (%s, теперь %s)",
               pending->order, m_requests_total, origTradeCmd, newTradeCmd);
    ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());

    m_requests_total++;
    //---- запускаем поток
    if (m_thread == NULL)
        if ((m_thread = (HANDLE)_beginthreadex(NULL, 256000, ThreadFunction, this, 0, &id))==NULL)
        {
            m_sync.Unlock();
            return(FALSE);
        }

    m_sync.Unlock();
    return(TRUE);
}
예제 #8
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CProcessor::Add(RequestInfo *request, int isStopout)
{
    Request *temp;
    UINT     id;
    Request  req = {0};
    static int uid = 1;

    if (request == NULL) return(FALSE);
    // проверки - кто управляет счетом
    if (m_delay == 0 || CheckGroup(m_groups, request->group) == FALSE)
        return (TRUE);

    // лог
    char reqTypeStr[64];
    char reqCmdStr[64];
    FormatCommand(request->trade.cmd, reqCmdStr);
    FormatRequestType(request->trade.type, reqTypeStr);
    CharString str;
    str.Printf(FALSE, "CProcessor::Add(тип [%s], cmd [%s])", reqTypeStr, reqCmdStr);
    ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());

    m_sync.Lock();
    //---- если место для запросов нет выделим
    if(m_requests == NULL)
    {
        if((m_requests = new Request[256]) == NULL)
        {
            m_sync.Unlock();
            return (FALSE);
        }
        m_requests_max = 256;
        m_requests_total = 0;
    }
    //---- посмотрим может надо перевыделить
    if (m_requests_total >= m_requests_max)
    {
        if((temp = new Request[m_requests_max + 256]) == NULL)
        {
            m_sync.Unlock();
            return(FALSE);
        }
        //---- скопируем старое
        memcpy(temp, m_requests, sizeof(Request) * m_requests_total);
        //---- удалим уже не нужное
        delete m_requests;

        m_requests = temp;
        m_requests_max += 256;
    }
    //---- вставляем запрос
    m_requests[m_requests_total].isStopout = isStopout;
    m_requests[m_requests_total].isPending = FALSE;
    m_requests[m_requests_total].id = request->id;
    m_requests[m_requests_total].time = GetTickCount();
    m_requests[m_requests_total].sent = FALSE;
    m_requests[m_requests_total].login = request->login;
    memcpy(&m_requests[m_requests_total].trans, &request->trade, sizeof(TradeTransInfo));
    COPY_STR(m_requests[m_requests_total].group, request->group);
    m_requests_total++;
    //---- запускаем поток
    if (m_thread == NULL)
        if ((m_thread = (HANDLE)_beginthreadex(NULL, 256000, ThreadFunction, this, 0, &id))==NULL)
        {
            m_sync.Unlock();
            return(FALSE);
        }

    m_sync.Unlock();
    return(TRUE);
}
void ConsoleController::EvaluateCommand(std::string command)
{
	consoleModel->ProcessResult(command, FormatCommand(command), commandInterface->Command(command));
}